[Problem Solving] 귤 고르기

Sean·2023년 9월 4일
0

Problem Solving

목록 보기
59/130

문제

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

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

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

제한 사항

  • 1 ≤ ktangerine의 길이 ≤ 100,000
  • 1 ≤ tangerine의 원소 ≤ 10,000,000

풀이

아이디어

  • 한정된 k개의 귤을 담는데, 사이즈의 종류 수가 최소가 되게 하려면 일단 각 사이즈 별로 몇 개가 있는지를 알아야 할 것 같다. 따라서, 사이즈와 개수를 key와 value로 가질 수 있는 자료구조를 선택해서 저장한다. (저는 내장객체 Map을 선택했습니다.)
  • Map을 완성시켰으면, 서로 다른 사이즈의 종류가 최소가 되게 하려면 가장 population이 높은 사이즈부터 k개를 채워넣는 것이 맞는 방향이다. 따라서, 사이즈마다의 개수를 따로 배열로 빼서, 해당 배열을 개수 기준으로 내림차순 정렬한다.
  • 위에서 만든 배열을 순회하면서 k가 없어질 때까지 k에서 현재 개수를 빼주고, answer에는 1을 더한다.

코드

function solution(k, tangerine) {
    //일단 귤을 순회하면서 사이즈 별로 개수를 Map에 기록하자.
    const tangerMap = new Map(); 
    tangerine.forEach(t => {
        tangerMap.set(t, (tangerMap.get(t) || 0) + 1);
    })
    
    //tangerMap을 순회하면서 {size: number, num: number}의 요소를 채우자.
    const tangerArr = [];
    for(let [s, n] of tangerMap) {
        tangerArr.push({size: s, num: n});
    }
    
    //tangerArr을 개수 기준으로 내림차순 정렬한다.
    tangerArr.sort((a, b) => b['num'] - a['num']);
    
    console.log('tangerArr: ', tangerArr);
    
    //k까지 정렬된 tangerArr을 순회하면서 개수를 반환한다.
    let answer = 0;
    for(let i=0; i<tangerArr.length; i++) {
        if(k<=0) break;
        else {
            k -= tangerArr[i].num;
            answer++;
        }
    }
    
    return answer;
}

돌아보기

  • 위 코드에서 굳이 tangerArr의 타입을 {size: number; num: number}[]로 잡지 않고 그냥 num만 추출했어도 문제를 풀 수 있었다.
profile
여러 프로젝트보다 하나라도 제대로, 깔끔하게.

0개의 댓글