

생각보다 문제가 굉장히 까다롭고 복잡하다. 이 문제에서의 포인트는 아래 세 가지 조건이다.
1. A가격에 달걀을 판다고 하면 Pi가 A가격보다 크거나 같은 모든 고객은 달걀을 산다.
2. 달걀 총 수량을 초과하여 팔 수 는 없다
3. 최대 수익을 올릴 수 있는 달걀의 가장 낮은 가격을 책정하는 것이다
문제 해결의 단계는 아래와 같다.
N, 고객의 수를 M으로 받고, 고객이 제시한 금액은 consumer 배열로 받는다.consumer 배열을 오름차순 정렬한다.total 배열을 초기화한다. 이 배열은 각 금액에 구매 가능한 고객의 수를 곱하여 모든 케이스의 수익을 저장한다.counter로 현재 제시된 금액보다 크거나 같은 가격의 수를 측정한다. 즉, counter가 해당 금액에 판매 가능한 고객의 수가 된다. 이때, counter의 크기가 N보다 작으면 total 배열에 0을 저장한다. 판매가 불가능 하기 때문이다.maxTotal에 total 배열의 최댓값 즉, 수익의 최댓값을 저장한다. maxIndex에 통해 해당 최댓값의 index 값을 저장하고 이를 이용하여 maxPrice에 달걀의 가격을 책정한다.코드 설계 2번 단계가 중요하다. 조건 3번째에서 달걀의 가장 낮은 가격을 책정한다 했다. 오름차순으로 정렬을 해야 달걀의 가격과 그 가격에 알맞은 수량을 곱해서 total에 저장할 경우 findIndex 함수는 앞에서부터 찾기 때문에 max값과 동일한 경우, 가격이 낮은 것을 선택할 수 있다.
const input = require("fs")
.readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
.toString()
.trim()
.split(/\s+/) // \s: 공백 문자, + : 하나 이상 연속 된 경우
.map(Number);
const N = input[0];
const M = input[1];
consumer = input.slice(2, 2+M);
consumer = consumer.sort((a,b)=>a-b);
let total = [];
for(let i=0; i<M; i++){
let counter = consumer.filter((arg) => arg >= consumer[i]).length;
if(counter <= N)
total[i] = consumer[i] * counter;
else
total[i] = 0;
}
const maxTotal = Math.max(...total);
const maxIndex = total.findIndex(arg => arg===maxTotal);
const maxPrice = consumer[maxIndex];
console.log(maxPrice + " " + maxTotal);
💡한줄평
이 문제는 생각보다 말장난이 많았던 것 같다. 얼핏 보기엔 간단해보이지만 왠지 모르게 정답을 이끌어내기가 어려웠다. 테스트 케이스가 1개밖에 없는 것도 큰 이유로 작용했던 것 같다. 테스트 케이스를 직접 생각해보는 시간도 필요한 것 같다.