[PGM] Level.2 귤 고르기
2025. 4. 1. 13:48ㆍAlgorithm/Greedy
코딩테스트 연습 - 귤 고르기
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤
school.programmers.co.kr
문제설명
귤 크기를 분류했을 때 서로 다른 종류의 수를 최소화
ex. 총 8개의 귤, 6개만 판매할 때 크기 종류가 가작 적게 판매
귤 사이즈 [1,2,2,3,3,4,5,5] => [2,2,3,3,5,5] => 3가지 종류
접근방법
그리디 활용
1. 딕셔너리 key 귤크기, value 갯수
2. 갯수 많은 것부터 판매(0,음수가 되면 종료)
구현코드
[Python]
import collections
def solution(k, tangerine):
type_count=0
counter_dict = collections.Counter(tangerine)
#print(counter_dict)
for count in sorted(counter_dict.values(),reverse=True):
k-= count # 많이 나온 귤부터 빼기
type_count+=1 # 종류 1개 증가
if k<=0: #음수면 멈춤
break
return type_count
[Java]
import java.util.*;
class Solution {
public int solution(int k, int[] tangerine) {
int typeCount = 0;
// 1. 귤 크기별 개수 세기
HashMap<Integer,Integer> countMap =new HashMap<>();
for (int size : tangerine) {
countMap.put(size, countMap.getOrDefault(size, 0) + 1);
}
// 2. 개수별 내림차순 정렬 리스트
List<Integer> countList = new ArrayList<>(countMap.values());
countList.sort(Collections.reverseOrder());
// 3. 갯수 많은 것부터 선택(k<1 종료)
for(int count:countList){
k -=count;
typeCount++;
if(k<=0){
break;
}
}
return typeCount;
}
}
▶Stream 정렬 활용
import java.util.*;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
HashMap<Integer,Integer> map =new HashMap<>();
//귤 <사이즈,갯수>
for (int t : tangerine) {
map.put(t, map.getOrDefault(t, 0) + 1);
}
//귤 크기 리스트
List<Integer> list = new ArrayList<>(map.keySet());
//귤 크기를 갯수 기준으로 내림차순 정렬
list.sort((o1, o2) -> map.get(o2)-map.get(o1));
//갯수 많은 것부터 고르기
for(Integer key:list){
k-=map.get(key);
answer++;
if(k<=0){
break;
}
}
return answer;
}
}
'Algorithm > Greedy' 카테고리의 다른 글
[PGM] Leve.3 섬 연결하기 (0) | 2024.12.13 |
---|---|
[PGM] Level.2 구명보트 (0) | 2024.09.07 |
[PGM] Level.1 체육복 (0) | 2024.08.30 |
[PGM] Level.0 개미군단 (0) | 2024.08.30 |
[PGM] Level.2 조이스틱 (0) | 2024.08.27 |