[백준 알고리즘] Node.js 1246. 온라인 판매

2023. 11. 27. 11:36코딩연습

1. 문제

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

 

1246번: 온라인 판매

첫째 줄에 정수 N(1 ≤ N ≤ 1,000)과 M(1 ≤ M ≤ 1,000)이 입력된다. 둘째 줄부터 M+1번째 줄까지 i+1번째 줄에는 Pi(1 ≤ Pi ≤ 1,000,000)가 입력된다.

www.acmicpc.net

 

2. 풀이

  • 달걀을 팔 때, 최대 수익을 올릴 수 있는 달걀의 가격과 합계를 구하는 문제다.
  • 예제에는 없지만 달걀의 총 개수가 사람 수보다 적을 때를 생각해야 한다.
    • 예를 들어 달걀을 2개가 있고 각 사람에게 팔 때의 가격이 2,3,4,5,6 이라고 가정하면, 최대 수익은 10이 된다.
const [N, M, ...P] = require('fs').readFileSync('/dev/stdin')
                      .toString().trim().split(/\s/).map(v => +v);

const findAns = () => {
  const sortedP = P.sort((a,b) => a-b); // 오름차순 정렬.
  // 만약 팔 수 있는 달걀의 개수가 하나뿐이라면, 가장 큰 값 했을 때, 최대 수익!
  if(N === 1) return [Math.max.apply(null, sortedP), Math.max.apply(null, sortedP)]

  let [count, sum] = [0,0];

  if(N > M){ // 달걀의 수가 고객보다 많을 때,
    for(let i = 0; i < M; i++){
      let n = sortedP[i] * (M - i);
      if(n >= sum) {
        count = sortedP[i];
        sum = n;
      }
    }
  } else { // 달걀의 수가 고객보다 적을 때,
    for(let i = 0; i < M; i++){ // 최대 가격으로 팔 일은 없으므로 M-1까지 반복.
      let n = sortedP[i] * N;
      // 위의 식은 무조건 달걀의 값 * 달걀의 수이기 때문에, 문제가 생김.
      // 아래의 if문을 통해 해당 값보다 크거나 같은 경우만을 찾아 계산하기 위해 작성함.
      if(M - i < N) n = sortedP[i] * (M-i);
      if(n >= sum) {
        count = sortedP[i];
        sum = n;
      }
    }
  }
  return [count, sum];
}

console.log(findAns().join(" "));

 

 

3. 정리

  • 좀 더 깔끔한 방법이 있을텐데............................