경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.
경화가 한 상자에 담으려는 귤의 개수 k
와 귤의 크기를 담은 배열 tangerine
이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
k | tangerine | result |
---|---|---|
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;
}
}
1.귤 종류별 개수를 해시맵으로 저장
2.귤 개수만 뽑아서 리스트에 저장
3.귤 개수가 담긴 리스트를 내림차순으로 정렬
4.내림차순으로 정렬된 귤 개수 리스트를 뽑고, 그 수만큼 k를 감소시키고, 종류+1
https://school.programmers.co.kr/learn/courses/30/lessons/138476