풀이 - 나의 생각
귤을 골르는데 필요한 건
결국 개수이다.
크기는 중요하지 않다.
그래서 Map을 사용해서 크기별 개수를 세고
개수가 많은 순서대로 정렬한 후
K에서 개수를 빼면서
사용되는 귤의 크기의 개수를 세면 해결!!!
보완할 점은
첫째
Map에 값을 넣을 때
if 문을 사용해서
key값에 해당하는게 있는지를 보고 값을 넣었는데
그것보다는
map.getOrDefault(KEY, DEFAULT_VALUE)를 사용해서
해당 값이 있으면
key에 해달하는 Value를
없으면 본인이 설정한 Default Value를 반환하는 메소드를 활용하면
소스의 가독성 및 성능이 올라간다.
둘째
Map은 정렬이 안되기 때문에
List에 Map의 value값을 넣어서 정렬을 하려고 했는데
처음에는 반복문을 통해
일일이 넣었다.
하지만,
List<Integer> num_cnt = new List<>(map.values());
이렇게
map.values()
를 사용하니까
소스의 가독성 및 성능이 올라갔다.
추가로
Array를 안쓰고
List를 쓴 이유는 역정렬을 위해서였다.
그런 의미에서 기억하자
Collections.sort(List Name) => 일반 정렬(오름차순)
Collections.sort(List Name, Collections.reverseOrder()) => 역 정렬(내림차순)
코드
1차 풀이
import java.util.*;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
Map<Integer, Integer> map = new HashMap<>();
for(int num : tangerine){
if(map.containsKey(num)){
map.put(num, map.get(num) + 1);
}else{
map.put(num, 1);
}
}
List<Integer> num_cnt = new ArrayList<>();
for(int key : map.keySet()){
num_cnt.add(map.get(key));
}
Collections.sort(num_cnt, Collections.reverseOrder());
for(int cnt : num_cnt){
k-=cnt;
answer++;
if(k <= 0) break;
}
return answer;
}
}
2차 풀이
import java.util.*;
class Solution {
public int solution(int k, int[] tangerine) {
int answer = 0;
Map<Integer, Integer> map = new HashMap<>();
for(int num : tangerine){
map.put(num, map.getOrDefault(num, 0) + 1);
}
List<Integer> num_cnt = new ArrayList<>(map.values());
Collections.sort(num_cnt, Collections.reverseOrder());
for(int cnt : num_cnt){
k-=cnt;
answer++;
if(k <= 0) break;
}
return answer;
}
}
728x90
'프로그래머스 > Lv.2' 카테고리의 다른 글
코딩테스트 연습 > 프로세스 - JAVA (0) | 2024.01.02 |
---|---|
코딩테스트 연습 > [1차] 캐시 - JAVA (1) | 2023.12.31 |
코딩테스트 연습 > N개의 최소공배수 - JAVA (1) | 2023.12.18 |
코딩테스트 연습 > 피보나치 수 - JAVA (2) | 2023.12.07 |
코딩테스트 연습 > 올바른 괄호 - JAVA (0) | 2023.11.03 |