[JS] 과일 장수

Yongmin Park·2024년 7월 21일
0

JS-Programmers

목록 보기
11/14

프로그래머스

요즘 코딩 테스트를 준비하는 분들이 많으시죠? 이번에는 프로그래머스에서 제공하는 '과일 장수' 문제를 디버깅하고 문제를 해결하면서 배운 점을 공유해 보려고 합니다. 이 문제는 간단한 알고리즘 문제로, 주어진 조건을 만족하면서 최대한의 이익을 얻는 방법을 찾아야 합니다.

문제 설명

과일 장수는 사과를 포장하여 판매하고 있습니다. 사과는 1점부터 k점까지의 점수로 분류되며, 가장 높은 점수가 최상품이죠. 사과 한 상자의 가격은 상자에 담긴 사과 중 가장 낮은 점수에 상자 안의 사과 개수를 곱한 값입니다.

예를 들어, 주어진 사과 점수가 [1, 2, 3, 1, 2, 3, 1]이고, 한 상자에 들어가는 사과가 4개일 때 얻을 수 있는 최대 이익은 [2, 3, 2, 3]으로 구성된 상자를 만들어 판매하는 것입니다. 이 상자의 가격은 2 * 4 = 8이 됩니다.

문제 해결

이 문제를 해결하기 위해서는 다음과 같은 단계로 접근할 수 있습니다:

  1. 사과 점수 정렬: 점수를 내림차순으로 정렬합니다. 그러면 상자를 만들 때 가장 높은 점수의 사과부터 선택할 수 있습니다.
  2. 최소 점수 찾기: 한 상자에 담기 최대한의 사과를 선택하고, 그 중 가장 낮은 점수를 구합니다.
  3. 최대 이익 계산: 각 상자의 가격을 계산하여 최대 이익을 구합니다.

단계별 코드 설명

다음은 문제를 해결하는 데 사용할 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; // 최대 이익을 반환합니다.
}

각 코드 라인을 하나씩 살펴볼까요?

  1. 내림차순 정렬: score.sort((a, b) => b - a) 부분에서는 주어진 점수 배열을 내림차순으로 정렬합니다. 이를 통해 가장 높은 점수의 사과부터 선택할 수 있습니다.

    let sortedScores = score.sort((a, b) => b - a);
  2. 상자 포장 및 가격 계산: 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;
    }
  3. 결과 반환: 최종적으로 최대 이익을 반환합니다.

    return answer;

결론

이 문제는 정렬과 단순한 반복문을 이용해 해결할 수 있는 알고리즘 문제입니다. 점수를 내림차순으로 정렬하고, 각 상자에서 최소 점수를 곱하여 최대 이익을 구하는 방식으로 접근하면 깔끔하게 풀 수 있습니다. 이러한 문제를 통해 배열 정렬과 수학적 계산 능력을 기를 수 있습니다.

코딩 테스트 준비하면서 작은 문제 하나라도 계속 풀다 보면 어느새 실력이 쌓여가니까 모두 화이팅하세요! 앞으로도 흥미로운 문제를 더 많이 다뤄보겠습니다. Happy Coding! 🚀

profile
기록으로 기적을

0개의 댓글