과일 장수의 최대 이익 계산: 점수에 따라 사과 상자 구성하기
이 문제는 주어진 조건에 따라 사과 상자를 구성하고, 최대 이익을 계산하는 문제입니다.
사과는 상태에 따라 1점부터 k점까지 점수가 매겨져 있으며, 한 상자에 m개의 사과를 담습니다. 상자에 담긴 사과 중 가장 낮은 점수를 기준으로 상자 가격이 결정되며, 가능한 한 최대 이익을 얻는 것이 목표입니다.
1. 문제 정의
사과는 1점에서 k점까지 분류되며, 사과 한 상자의 가격은 그 상자에 담긴 사과 중 가장 낮은 점수에 따라 정해집니다. 사과가 주어졌을 때, 다음 조건을 만족하는 상자를 만들어 최대 이익을 계산하는 것이 이번 문제의 핵심입니다
- 한 상자에는 정확히 m개의 사과를 담습니다.
- 상자의 가격은 최저 사과 점수 * m으로 계산됩니다.
- 남는 사과는 버려지며, 최대 이익을 구해야 합니다.
예를 들어, 주어진 사과 점수 배열이 [1, 2, 3, 1, 2, 3, 1]이고, 한 상자에 m = 4개씩 담는다면, 최대 이익은 8이 됩니다.
2. 문제 해결 과정
이 문제는 사과를 상자에 담아야 하는데, 가능한 한 높은 점수의 사과로 상자를 구성하여 이익을 극대화해야 합니다. 이를 위해 정렬을 활용하여 최적의 상자를 만들 수 있습니다.
1. 사과 점수 정렬
최대한 높은 점수를 가진 사과로 상자를 채우기 위해 먼저 사과의 점수 배열을 내림차순으로 정렬합니다. 이렇게 하면 큰 점수부터 상자를 구성할 수 있으며, 상자의 최저 점수를 최대화할 수 있습니다.
2. 상자 구성
정렬된 사과 배열에서 앞에서부터 m개씩 상자를 만들어가며, 각 상자에서 가장 낮은 점수를 기준으로 상자의 가격을 계산합니다. 상자를 만들 수 없는 나머지 사과는 버려지므로, 정확히 m개씩 담을 수 있을 때만 상자를 구성합니다.
3. 최대 이익 계산
각 상자의 가격은 최저 점수 * m으로 계산되며, 모든 상자의 가격을 합한 것이 최종 이익이 됩니다. 남는 사과는 상자에 담지 않기 때문에, 이익을 계산할 때 포함되지 않습니다.
3. 코드 구현
다음은 위 과정을 바탕으로 한 코드입니다:
function solution(k, m, score) {
let answer = 0;
// 1. 사과 점수를 내림차순으로 정렬
score.sort((a, b) => b - a);
// 2. m개씩 상자를 구성하며, 각 상자의 최저 점수를 기준으로 가격 계산
for (let i = 0; i < score.length; i += m) {
// 상자를 만들 수 없을 만큼 사과가 부족하면 종료
if (i + m > score.length) break;
// 현재 상자의 최저 점수는 m번째 사과의 점수
const boxPrice = score[i + m - 1] * m;
answer += boxPrice;
}
return answer;
}
이 문제는 주어진 조건에 따라 사과 상자를 구성하고, 상자의 가격을 계산하여 최대 이익을 구하는 문제입니다.
핵심은 사과 점수를 내림차순으로 정렬한 후 m개씩 상자를 구성하는 전략을 통해 상자의 최저 점수를 최대화하는 것입니다. 정렬과 반복문을 효율적으로 활용하여, 제한된 시간 안에 문제를 해결할 수 있었습니다.
'SOLVED.' 카테고리의 다른 글
[프로그래머스] 기사단원의 무기 (JS) (0) | 2024.12.02 |
---|---|
[프로그래머스] 문자열 나누기 (JS) (1) | 2024.11.26 |
[프로그래머스 Level 2] 방문 길이 (JS) (2) | 2024.11.06 |
[프로그래머스 Level 3] 입국심사 (JS) (0) | 2024.11.05 |
[프로그래머스] 덧칠하기 (JS) (1) | 2024.08.30 |