문제 링크
https://www.acmicpc.net/problem/1744
풀이
const [ _, ...arr ] = require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s+/).map(v => +v);
const solve = (arr) => {
let answer = 0;
const pos = arr.filter(v => v > 0).sort((a, b) => b - a);
const neg = arr.filter(v => v <= 0).sort((a, b) => a - b);
for (i = 0; i < pos.length; i += 2) {
if (i === pos.length - 1) answer += pos[i];
else if (pos[i] * pos[i + 1] > pos[i] + pos[i + 1]) {
answer += pos[i] * pos[i + 1];
} else {
answer += pos[i] + pos[i + 1];
}
}
for (i = 0; i < neg.length; i += 2) {
if (i === neg.length - 1) answer += neg[i];
else answer += neg[i] * neg[i + 1];
}
console.log(answer);
};
solve(arr);
조건을 잘 설정해야 하는 문제다.
수열을 양수와 양수가 아닌 것으로 나누고, 양수는 내림차순, 음수는 오름차순 정렬한다.
양수인 수열을 index를 2씩 증가시키며 순회하면서 아래와 같이 동작한다.
- 앞에서부터 인접한 두 수를 곱했을 때, 두 수를 더한 것보다 크면 곱하여 answer에 더한다.
- 그렇지 않다면(두 수 중 최소 하나가 1인 경우), 그냥 answer에 두 수를 더한다.
- 양수의 개수가 홀수 개라면 마지막 하나 남은 수는 그냥 answer에 더한다.
음수(0 포함)인 수열을 index를 2씩 증가시키며 순회하면서 아래와 같이 동작한다.
- 앞에서부터 인접한 두 수를 곱한 값을 answer에 더한다.
- 음수의 개수가 홀수 개라면 마지막 하나 남은 수는 그냥 answer에 더한다.
양수일 때는 1인 경우를 제외하면 앞에서부터 인접한 두 수를 곱하여 더해야 가장 큰 값을 얻을 수 있다. 음수일 때는 곱셈을 하면 반드시 더한 것보다 커지기 때문에 모두 인접한 두 수를 곱해서 더하면 된다. 두 경우 모두 홀수 개인 경우 마지막 수는 그냥 더해준다.
'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 2748 - Node.js] 피보나치 수 2 (0) | 2022.03.19 |
---|---|
[백준 3036 - Node.js] 링 (0) | 2022.02.13 |
[백준 1339 - Node.js] 단어 수학 (0) | 2021.12.06 |
[백준 1182 - Node.js] 부분수열의 합 (0) | 2021.12.01 |
[백준 10972] 다음 순열 with Node.js (0) | 2021.12.01 |