https://school.programmers.co.kr/learn/courses/30/lessons/138476
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){ // (1)
map.put(t, map.getOrDefault(t,0)+1);
}
List<Integer> list = new ArrayList<>(map.values()); //(2)
list.sort((a,b) -> b-a); //(3)
for(int i=0;i<list.size();i++){
if(k<=0){
break;
}
else{
k= k-list.get(i);
answer++;
}
}
return answer;
}
}
특정 요소와 그 요소의 개수를 사용해야 하는 문제의 경우 HashMap을 사용하자
내가 생각한 풀이과정은 아래와 같다
1. 요소와 그 요소의 개수를 HashMap을 이용해서 저장
2. 위 HashMap에서 요소의 개수들만 뽑아서 ArrayList로 저장
3. 이렇게 만든 ArrayList를 내림차순으로 정렬
(한 종류가 많은 개수의 귤을 사용해야 귤의 종류를 적게 사용할 수 있기 때문이다.). --> 중요!!!
4. K값에서 이를 빼가면서 answer에 값을 하나씩 더한다.
여기서 중요한 포인트는 두가지 이다.
(1)
for ( int t : tangerine ) 의 반복문을 이용해 tangerine 배열 안에 요소를 하나씩 가져오면서 map.getOrDefault( ) 메소드를 사용해서 (key: 요소, value :요소의 개수) 형태로 HashMap을 만든다.
(2)
List<Integer> list = new ArrayList<>(map.values( ))
를 이용해서 map의 value값들인 요소의 개수들로 ArrayList를 만든다.
(3)
위 ArrayList를 내림차순으로 만들기 위해 list.sort((a,b) -> b-a)를 이용한다
일반 배열과 리스트 배열의 sort()메소드의 표현 방식이 다르니 아래를 참고하자.
일반(Array) 배열 : Arrays.sort(arr, (a,b) -> b-a)
리스트(List) 배열: list.sort((a,b) -> b-a)
마지막으로 K 값에서 list.get(인덱스값)을 통해 빼가면서 반복문을 돌아 answer+1 값을 해준다.
(K=0일때까지로 반복문 조건을 돌면 K값이 음수값이 되므로 K<=0일때가지만 반복문을 돌려준다)
'코딩테스트 > 문제풀이 팁' 카테고리의 다른 글
Stream, 되도록이면 사용하지 말자 (0) | 2024.02.26 |
---|---|
[HashSet, HashMap] 롤케이크 자르기 (0) | 2024.02.26 |
[PriorityQueue] 효율적인 스케줄링 (0) | 2024.02.21 |
시간 복잡도 계산 (1) | 2024.02.20 |
int[] -> List<Integer> 반환? 메소드 리턴타입을 바꾸자 (0) | 2024.02.19 |