
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';
const inputs = fs
.readFileSync(path)
.toString()
.trim()
.split('\n')
.map(Number);
inputs.shift();
const plus = inputs.filter((it) => it > 0).sort((a, b) => a - b);
const minus = inputs
.filter((it) => it <= 0)
.map((it) => it * -1)
.sort((a, b) => a - b);
let ans = 0;
while (plus.length) {
const a = plus.pop();
const b = plus.pop();
if (!b) ans += a;
else if (a * b < a + b) ans += a + b;
else ans += a * b;
}
while (minus.length) {
const a = minus.pop();
const b = minus.pop();
if (b === undefined) ans -= a;
else if (b !== 0) ans += a * b;
}
console.log(ans);
⏰ 소요한 시간 : -
먼저 숫자를 양수 음수로 나누어 준 뒤 정렬한다. 정렬하게되면 pop 메서드를 사용해 가장 큰 두개의 수를 뽑아 곱해주면 되기 때문이다. 0인경우는 음수배열에 넣어주었고 음수배열은 양수로 치환한 뒤 정렬한다.
근데 이 때 양수의 개수가 홀수라면 마지막 반복 시 pop했을때 undefined가 나오게 된다. 따라서 b가 undefined일 경우에는 a만 합계변수 ans에 더해주면 된다. 그리고 a나 b가 1일 경우는 두 수를 곱하는 경우보다 더하는 경우에 최댓값이 나온다. 따라서 이 경우에는 더하는 값을 ans에 넣어주고 그 외의 경우에는 두 수를 곱해서 ans에 넣어준다.
양수일 경우와 마찬가지로 음수의 개수가 홀수개라면 마지막 반복시 pop한 요소는 undefined가 나오게 된다. 따라서 마지막 남은요소는 어쩔 수 없이 빼줘야 하기때문에 b가 undefined일 경우를 따로 계산해준다.
그 후 b가 0이 아니라면 무조건 양수로 만들어서 최대값을 만들 수 있기 때문에 이 경우에만 정답배열에 곱한 값을 넣어준다. b가 0이라면 곱한 결과값이 0으로 상쇄되므로 아무런 조취도 취하지 않아도 된다.