[백준1744_자바스크립트(javascript)] - 수 묶기

경이·2024년 9월 28일

𝑩𝑶𝑱 (𝒋𝒔)

목록 보기
191/325

🔴 문제

수 묶기


🟡 Sol

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에 더해주면 된다. 그리고 ab1일 경우는 두 수를 곱하는 경우보다 더하는 경우에 최댓값이 나온다. 따라서 이 경우에는 더하는 값을 ans에 넣어주고 그 외의 경우에는 두 수를 곱해서 ans에 넣어준다.
양수일 경우와 마찬가지로 음수의 개수가 홀수개라면 마지막 반복시 pop한 요소는 undefined가 나오게 된다. 따라서 마지막 남은요소는 어쩔 수 없이 빼줘야 하기때문에 bundefined일 경우를 따로 계산해준다.
그 후 b0이 아니라면 무조건 양수로 만들어서 최대값을 만들 수 있기 때문에 이 경우에만 정답배열에 곱한 값을 넣어준다. b0이라면 곱한 결과값이 0으로 상쇄되므로 아무런 조취도 취하지 않아도 된다.


🔵 Ref

profile
록타르오가르

0개의 댓글