[백준] 20300 서강근육맨 JavaScript

·2024년 10월 16일

문제

로니 콜먼 동영상을 보고 보디빌더가 되기로 결심한 향빈이는 PT 상담을 받으러 서강헬스클럽에 갔다. 향빈이가 서강헬스클럽을 선택한 이유는 PT를 받을 때 사용하는 운동기구를 회원이 선택할 수 있다는 점 때문이다. 하지만, 서강헬스클럽은 항상 사람이 많아서 PT를 한 번 받을 때 운동기구를 최대 두 개까지만 선택할 수 있다.

헬스장에 있는 N개의 운동기구를 한 번씩 사용해보고 싶은 향빈이는 PT를 받을 때마다 이전에 사용하지 않았던 운동기구를 선택하기로 계획을 세웠다. 그리고 비용을 절약하기 위해 PT를 받을 때 운동기구를 되도록이면 두 개를 사용하기로 했다. 예를 들어, 헬스장에 총 10개의 운동기구가 있을 경우 PT를 5번 받으면 모든 기구를 다 사용할 수 있다. 9개의 운동기구가 있는 경우에도 PT를 5번 받지만, 마지막 PT를 받을 때는 운동기구를 하나만 사용한다.

하지만 향빈이는 운동기구를 선택하다가 큰 고민에 빠졌다. 왜냐하면 운동기구마다 근손실이 일어나는 정도가 다르기 때문이다. 어떤 운동기구는 자극이 잘 안 와서 근손실이 적게 일어나는데, 어떤 운동기구는 자극이 잘 와서 근손실이 많이 일어난다. 근손실이 죽음보다 무서운 향빈이는 PT를 한 번 받을 때의 근손실 정도가 M을 넘지 않도록 하고 싶다. 이때, M의 최솟값을 구해보자. 참고로, 운동기구를 두 개 사용해서 PT를 받을 때의 근손실 정도는 두 운동기구의 근손실 정도의 합이다.

입력

첫째 줄에 서강헬스클럽에 비치된 운동기구의 개수를 나타내는 정수
N이 주어진다. (1 <= N <= 10000)

둘째 줄에는 각 운동기구의 근손실 정도를 나타내는 정수 t_1, t_2, ..., t_N가 주어진다. (0 <= t_i <= 10^18)

출력

M의 최솟값을 출력한다.

예제 입력

5
1 2 3 4 5

예제 출력

5

내가 했던 풀이 방법

  1. t가 10^18이므로 t를 BigInt로 변환한 다음 오름차순으로 정렬해준다.
  2. M을 BigInt형인 0으로 초기화해준다.
  3. N이 짝수일 때는 가장 근손실이 많이 일어나는 운동과 적게 일어나는 운동을 조합해서 운동하면 된다. [1, 2, 3, 4]일 경우 [1, 4][2, 3]으로 운동해야 한다. 그렇게 생성된 조합 중 가장 큰 값이 M이 된다.
  4. 홀수일 경우에는 가장 근손실이 많이 일어나는 운동을 마지막 날에 단독으로 해야한다. 즉, N-1개의 운동을 3번과 같이 조합해준 가장 큰 값과 가장 근손실이 많이 일어나는 운동 중에 더 큰 값이 M이 된다.

코드

const fs = require('fs');
let [N, t] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

N = Number(N);
t = t
  .trim()
  .split(' ')
  .map(BigInt)
  .sort((a, b) => (a > b ? 1 : -1));

let M = 0n;

if (N % 2 !== 0) {
  for (let i = 0; i < (N - 1) / 2; i++) {
    M = M > t[i] + t[N - i - 2] ? M : t[i] + t[N - i - 2];
  }
  M = M > t[N - 1] ? M : t[N - 1];
} else {
  for (let i = 0; i < N / 2; i++) {
    M = M > t[i] + t[N - i - 1] ? M : t[i] + t[N - i - 1];
  }
}

console.log(M.toString());

회고

BigInt형을 생각 못해서 틀린 문제... BigInt형으로 Max/Min 구하기가 너무 불편하다. 그것 때문에 실수로 한 번 더 틀렸다....ㅜ M의 최솟값을 구하라곤 하지만 실제로 구해야하는 값은 최댓값이 M의 최솟값이 된다. (문제를 읽어보면 당연하다) 다만 최솟값을 구하라고 해서 자꾸 max...인가...? min인가...? 헷갈렸다. 그래도 문제 풀이 방법은 어렵지 않게 떠올릴만한 문제

profile
Frontend🍓

0개의 댓글