[백준 알고리즘] 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. 정리
- 좀 더 깔끔한 방법이 있을텐데............................
'코딩연습' 카테고리의 다른 글
[백준 알고리즘] Node.js 1448. 삼각형 만들기 (2) | 2023.12.05 |
---|---|
[백준 알고리즘] Node.js 1021. 회전하는 큐 (1) | 2023.11.29 |
[백준 알고리즘] Node.js 1059. 좋은 구간 (2) | 2023.11.24 |
[백준 알고리즘] Node.js 1235. 학생 번호 (0) | 2023.11.22 |
[백준 알고리즘] Node.js 1205. 등수 구하기 (0) | 2023.11.22 |