본문 바로가기
코딩테스트/문제풀이 팁

[HashMap] 여러 요소와 요소의 개수세기

by asdft 2024. 2. 25.

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일때가지만 반복문을 돌려준다)