본문 바로가기
코딩테스트/programming_JAVA

[Java] 프로그래머스_138476 : 귤 고르기

by prometedor 2024. 1. 4.

HashMap 이용하기

귤 고르기 : Level2

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> hm = new HashMap<>();
        
        // HashMap을 사용하여 각 종류의 감귤과 해당 종류의 개수를 저장
        for (int n : tangerine) {
            if (hm.containsKey(n)) {
                hm.put(n, hm.get(n) + 1);
            } else {
                hm.put(n, 1);
            }
        }
        
        // HashMap의 엔트리를 값에 따라 내림차순으로 정렬
        // 이를 위해 List를 사용하고, Collections.reverseOrder와 Map.Entry.comparingByValue를 활용
        List<Map.Entry<Integer, Integer>> el = new LinkedList<>(hm.entrySet());
        el.sort(Collections.reverseOrder(Map.Entry.comparingByValue()));
        
        // 정렬된 엔트리 리스트를 순회하면서, 남은 수확량 k가 0이 될 때까지 가장 많이 나오는 종류부터 선택하여 수확
        for (Map.Entry<Integer, Integer> entry : el) {
            if (k > 0) {
                int count = Math.min(k, entry.getValue()); // 이때, 해당 종류의 감귤 개수와 남은 수확량 중 작은 값을 선택하여 수확
                k -= count;
                answer++; // 수확한 종류의 개수를 answer에 추가합니다.
            }
        }
        
        return answer;
    }
}

 

 

int count = Math.min(k, entry.getValue());

 

ㄴ 이걸 해주는 이유는 현재 종류의 감귤이 남은 수확량 k보다 많이 나왔더라도, 모든 감귤을 수확하는 것이 아니라 k만큼만 수확해야 하기 때문이다.

 


 

 

문제점 : 감귤이 남은 수확량 k보다 많을 경우를 고려하지 않아 테스트 케이스 실행에서 계속 실패하였다.

해결 방법 : 감귤이 남은 수확량 k보다 많을 경우를 고려하여 k만큼만 수확하도록 코드를 추가했다.

깨달은 바 : 여러가지 조건을 잘 고려하여 코드를 작성해야겠다.