[HashMap] 여러 요소와 요소의 개수세기
https://school.programmers.co.kr/learn/courses/30/lessons/138476
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
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일때가지만 반복문을 돌려준다)