귤 고르기 (level 2)

원용현·2022년 11월 30일
0

프로그래머스

목록 보기
33/49

링크

https://school.programmers.co.kr/learn/courses/30/lessons/138476

문제

경화는 과수원에서 귤을 수확했다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 한다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 할 때 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때이다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어진다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성하라.

문제 풀이

크기의 종류 별로 귤의 개수가 얼마나 있는지 먼저 확인한다. 판매하려는 k개의 수를 채우는데 가장 적은 귤의 종류를 선택해야하기 때문에 가장 많은 귤들부터 차례대로 선택을 한다.

문제 해결에서 이 문제를 배열로만 구현하면 런타임 에러 혹은 시간 초과 오류가 나올 수 있기 때문에 Map을 만들어서 구현한다.

코드

function solution(k, tangerine) {
    let obj = {}
    let result = 0
    
    // 귤의 크기에 따라서 개수를 채워준다. obj에 크기에 대한 key가 존재하면 + 1, 없으면 1을 넣는다.
    tangerine.map(el => {
        obj[el] = obj[el] + 1 || 1
    })
    
  	// 만들어진 obj를 값만 가져와서 내림정렬을 실시한다. key 값은 따로 필요가 없기 때문에 
    const arr = Object.values(obj).sort((a, b) => b - a)
    
    // 판매할 귤의 개수 k가 0 혹은 음수가 나올 때까지 while문을 반복한다.
    while(k > 0) {
        k -= arr[result]
        result++
    }
    
    return result
}

0개의 댓글