[프로그래머스-Level 1] [JavaScript] 과일 장수 - 배열, 최솟값 이용

2022. 11. 28. 12:25알고리즘/프로그래머스 알고리즘 공부

반응형

[문제]

사과 상자를 포장한다고 가정합니다. 사과는 상태에 따라 1점-k점까지의 점수로 분류되며 최상품의 사과가 k점수이고 1점이 최하품의 사과입니다. 한 상자에 사과를 m개씩 담아서 포장하며 상자에 담긴 사과 중에 가장 낮은 점수가 1이상 k이하라면 한 상자의 가격은 p 곱하기 m입니다. 상자 단위로만 포장해서 판매되며 남는 사과 즉 나머지는 버립니다. k가 3, m이 4라고 가정했을 때 [1,2,3,1,2,3,1] 이렇게 7개의 사과 점수가 주어지는 경우 [2,3,2,3] 이렇게 사과 상자를 1개를 만들어 판매할 수 있습니다. 즉 최종 결과는 (최저 사과 점수 * 한 상자에 있는 사과 개수 * 상자 개수) = 8이 됩니다. (2 * 4 * 1) = 8 

 

[알고리즘]

정렬, 배열, Math.min 사용하여 최솟값을 구합니다.

 

[풀이]

먼저 sort 함수를 이용해 오름차순으로 정렬해주고, score 배열에 담겨진 요소들을 하나씩 box에 담아줍니다. m이 4일 경우에 한 박스당 4개의 사과가 들어가기 때문에 (i + 1) % m을 통해 4개씩 담아주면 됩니다. 담겨진 박스들에 다시 반복문을 돌려서 한 박스에 최소 점수를 Math.min 함수를 통해 얻어와서 상자개수를 곱해주면 됩니다.

function solution(k, m, score) {
    let answer = 0;
    const boxes = [];
    
    // 배열 오름차순 정렬
    score.sort((a, b) => b - a);
    
    // 배열 요소를 하나씩 제거하여 상자를 만듦.
    for (let i = 0, box = []; i < score.length; i++) {
        box.push(score[i]);
        if ((i + 1) % m === 0) {
            boxes.push(box);
            box = [];
        }
    }
    
    // 최솟값을 구하여 m개씩 곱해서 answer 총합에 더함.
    for (let i = 0; i < boxes.length; i++) {
        answer += Math.min(...boxes[i]) * m;
    }
    
    return answer;
}

 

반응형