연습장/백준(BOJ) 문제풀이

[백준 1744 - Node.js] 수 묶기

Tesseractjh 2021. 12. 6. 01:20

문제 링크

https://www.acmicpc.net/problem/1744

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에

www.acmicpc.net

풀이

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인 경우를 제외하면 앞에서부터 인접한 두 수를 곱하여 더해야 가장 큰 값을 얻을 수 있다. 음수일 때는 곱셈을 하면 반드시 더한 것보다 커지기 때문에 모두 인접한 두 수를 곱해서 더하면 된다. 두 경우 모두 홀수 개인 경우 마지막 수는 그냥 더해준다.