요즘 코딩 테스트를 준비하는 분들이 많으시죠? 이번에는 프로그래머스에서 제공하는 '과일 장수' 문제를 디버깅하고 문제를 해결하면서 배운 점을 공유해 보려고 합니다. 이 문제는 간단한 알고리즘 문제로, 주어진 조건을 만족하면서 최대한의 이익을 얻는 방법을 찾아야 합니다.
과일 장수는 사과를 포장하여 판매하고 있습니다. 사과는 1점부터 k점까지의 점수로 분류되며, 가장 높은 점수가 최상품이죠. 사과 한 상자의 가격은 상자에 담긴 사과 중 가장 낮은 점수에 상자 안의 사과 개수를 곱한 값입니다.
예를 들어, 주어진 사과 점수가 [1, 2, 3, 1, 2, 3, 1]
이고, 한 상자에 들어가는 사과가 4개일 때 얻을 수 있는 최대 이익은 [2, 3, 2, 3]
으로 구성된 상자를 만들어 판매하는 것입니다. 이 상자의 가격은 2 * 4 = 8
이 됩니다.
이 문제를 해결하기 위해서는 다음과 같은 단계로 접근할 수 있습니다:
다음은 문제를 해결하는 데 사용할 JavaScript 코드입니다.
function solution(k, m, score) {
let answer = 0;
let sortedScores = score.sort((a, b) => b - a); // 점수를 내림차순으로 정렬합니다.
// 가장 높은 점수의 사과부터 시작하여 한 상자씩 묶습니다.
for (let i = 0; i < Math.floor(score.length / m) * m; i += m) {
let min = Math.min(...sortedScores.slice(i, i + m)); // 현재 상자에서 가장 낮은 점수를 찾습니다.
answer += (min > k ? k : min) * m; // 가장 낮은 점수에 m을 곱하여 가격을 계산합니다.
}
return answer; // 최대 이익을 반환합니다.
}
각 코드 라인을 하나씩 살펴볼까요?
내림차순 정렬: score.sort((a, b) => b - a)
부분에서는 주어진 점수 배열을 내림차순으로 정렬합니다. 이를 통해 가장 높은 점수의 사과부터 선택할 수 있습니다.
let sortedScores = score.sort((a, b) => b - a);
상자 포장 및 가격 계산: for
루프를 사용하여 각 상자를 만들고, 그 상자에서 가장 낮은 점수를 찾아 가격을 계산합니다. Math.floor(score.length / m) * m
는 사과를 상자에 나누어 담을 수 있는 최대 개수를 계산하는 부분입니다.
for (let i = 0; i < Math.floor(score.length / m) * m; i += m) {
let min = Math.min(...sortedScores.slice(i, i + m));
answer += (min > k ? k : min) * m;
}
결과 반환: 최종적으로 최대 이익을 반환합니다.
return answer;
이 문제는 정렬과 단순한 반복문을 이용해 해결할 수 있는 알고리즘 문제입니다. 점수를 내림차순으로 정렬하고, 각 상자에서 최소 점수를 곱하여 최대 이익을 구하는 방식으로 접근하면 깔끔하게 풀 수 있습니다. 이러한 문제를 통해 배열 정렬과 수학적 계산 능력을 기를 수 있습니다.
코딩 테스트 준비하면서 작은 문제 하나라도 계속 풀다 보면 어느새 실력이 쌓여가니까 모두 화이팅하세요! 앞으로도 흥미로운 문제를 더 많이 다뤄보겠습니다. Happy Coding! 🚀