[문제 설명]
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.
경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
[문제 풀이]
import java.util.*;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
HashMap<Integer, Integer> hm = new HashMap<>();
for (int size : tangerine) {
hm.put(size, hm.getOrDefault(size, 0)+1);
}
List<Integer> sizeList = new ArrayList<>(hm.values());
Collections.sort(sizeList, Collections.reverseOrder());
int sum = 0;
for (int i=0; i<sizeList.size(); i++) {
if (sum-k < 0) {
sum += sizeList.get(i);
answer++;
}
}
return answer;
}
}
첫번째 시도로 통과했습니다. 프로그래머스 레벨2 문제 중에서도 매우 쉬운 편입니다. (정답률 60%)
접근 방법은 같은 크기의 귤이 몇 개 있는지 중복을 찾은 후 개수가 많은 순으로 정렬합니다.
그리고 앞에서부터 더하며 k개 이상이 되는 최솟값을 return 합니다.
[포인트]
hm.put(size, hm.getOrDefault(size, 0)+1);
HashMap을 사용할 때 빠지지 않는 getOrDefault 함수는 key으로 value 찾고 value 값이 없으면 default로 설정된 값을 반환합니다.
여기선 default 값이 0이고 같은 크기의 귤을 찾을 때마다 본래 value 값에 1을 더해 put 합니다.
List<Integer> sizeList = new ArrayList<>(hm.values());
HashMap의 값들로만 List를 만들기
Collections.sort(sizeList, Collections.reverseOrder());
List를 내림차순(큰 순으로) 정렬하기
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] PCCP 기출문제 2번 석유 시추 (LV.2/JAVA) (2) | 2024.12.17 |
---|---|
[프로그래머스] 호텔 방 배정 (LV.4/JAVA) (1) | 2024.08.12 |
[프로그래머스] 달리기 경주 (LV.1/JAVA) (0) | 2024.06.10 |
[프로그래머스] 점 찍기 (LV.2/JAVA) (1) | 2024.03.01 |
[프로그래머스] 롤케이크 자르기 (LV.2/JAVA) (1) | 2024.03.01 |