귤 고르기
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/138476
접근 방식
가장 먼저 떠오른 방식은 set와 순열을 통한 방식이다.
하지만, 길이가 10만이기에 이 방식은 적합하지 않다. (너무 오래걸림)
따라서, 다른 방식을 생각해야 했다.
생각난 방식은 Hash를 이용한 방식이다.
각 숫자와 등장 횟수를 Hash로 만들고, k가 충족될 때까지 더하는 것이다. (많이 나온 숫자부터)
결과
소스 코드
import java.util.*;
class Solution {
public int solution(int k, int[] tangerine) {
Map<Integer, Integer> map = new HashMap<>();
for(int t:tangerine){
int cnt = map.getOrDefault(t, 0);
map.put(t, cnt+1);
}
int answer = 0;
int sum = 0;
List<Integer> list = new ArrayList<>(map.values());
Collections.sort(list, Collections.reverseOrder()); // 내림차순
for(int i=0; i<list.size(); i++){
sum+=list.get(i);
answer++;
if(sum>=k) break;
}
return answer;
}
}
맵에 숫자 종류 별 갯수를 저장한다.
저장된 갯수만으로 리스트를 생성한 뒤, 내림차순하여 가장 많은 갯수를 가진 숫자부터 더해간다.
더했을 때, 충족해야하는 k를 넘어선다면 종료
다른 접근 방식
없음.
알게 된 점
없음.