[코딩테스트연습]프로그래머스-[1차] 뉴스 클러스터링 (Lv2)

이능멸·2023년 1월 25일
0

코딩테스트연습

목록 보기
21/64

📝 문제설명

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

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

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

❗ 제한 사항

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

🔍입출력 예시

ktangerineresult
6[1, 3, 2, 5, 4, 5, 2, 3]3
4[1, 3, 2, 5, 4, 5, 2, 3]2
2[1, 1, 1, 1, 2, 2, 2, 3]1

📌 작성코드

import java.util.*;

class Solution {
    public int solution(int k, int[] tangerine) {
        int answer = 0;
        int arrLen = tangerine.length;
        ArrayList<Integer> list = new ArrayList(); //귤종류마다 개수가 저장될 리스트
        HashMap<Integer, Integer> hashMap = new HashMap(); //귤종류/개수(key/value)가 저장될 해시맵
        
        for(int i=0; i<arrLen; i++) {
            hashMap.put(tangerine[i], hashMap.getOrDefault(tangerine[i], 0) + 1); //귤종류마다 개수를 저장한다.
        }
        
        for(Integer i : hashMap.keySet()) {
            list.add(hashMap.get(i)); //개수만 뽑아서 저장
        }
        
        list.sort(Comparator.reverseOrder()); //개수들을 내림차순으로 정렬
        
        for(int i=0; i<list.size(); i++) {
            k -= list.get(i); //뽑은 숫자만큼 k감소
            answer++; //귤종류 +1
            if(k<1){ //귤 개수를 다 담거나, 초과하여 담은 경우
                return answer;
            }
        }

        return answer;
    }
}

💯Review

1.귤 종류별 개수를 해시맵으로 저장
2.귤 개수만 뽑아서 리스트에 저장
3.귤 개수가 담긴 리스트를 내림차순으로 정렬
4.내림차순으로 정렬된 귤 개수 리스트를 뽑고, 그 수만큼 k를 감소시키고, 종류+1

🧾출처

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

profile
안녕하세요

0개의 댓글