Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

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

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

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

저작자표시 비영리 (새창열림)

'연습장 > 백준(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
    '연습장/백준(BOJ) 문제풀이' 카테고리의 다른 글
    • [백준 2748 - Node.js] 피보나치 수 2
    • [백준 3036 - Node.js] 링
    • [백준 1339 - Node.js] 단어 수학
    • [백준 1182 - Node.js] 부분수열의 합
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바