기본 콘텐츠로 건너뛰기

코딩 테스트 - 귤 고르기 (Map.Entry와 List sort)

 귤 먹고 싶다

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class Solution {
    public int solution(int k, int[] tangerine) {
        int answer = 0;
        int count = 0;
       
        HashMap <Integer, Integer>map = new HashMap<>();
        for(int i = 0; i < tangerine.length; i++){
            if(map.get(tangerine[i]) == null){
                map.put(tangerine[i], 1);
            }else{
                int temp = (int)map.get(tangerine[i]);
                map.put(tangerine[i], temp+1);
            }
        }

        //value 기준으로 내림차순 정렬
        List<Integer> keySet = new ArrayList<>(map.keySet());      
        keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));


        for (Integer key : keySet) {
            int keyVal = map.get(key);            
            count = count + keyVal;
            answer++;

            if(count > k){
                //정답보다 k가 작으면 다시 빼줌
                count = count - keyVal;
                answer--;
                //System.out.println("다시 빼줌 " + count);
            }else if(count == k){
                //종료
                //System.out.println("끝! 정답값 " + count);
                break;
            }else{
                //정답보다 k가 크면 계속 더함
                //System.out.println("정답값 " + count);
            }
        }

        return answer;
    }
}

이렇게 호로록 짰는데 시간 초과 떠서 고민!!

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
    public int solution(int k, int[] tangerine) {
        int answer = 0;
        int count = k;
       
        HashMap <Integer, Integer>map = new HashMap<>();
        for(int i = 0; i < tangerine.length; i++){
            if(map.get(tangerine[i]) == null){
                map.put(tangerine[i], 1);
            }else{
                int temp = (int)map.get(tangerine[i]);
                map.put(tangerine[i], temp+1);
            }
        }

        // 개수(value)가 많은 순으로 정렬
        List<Map.Entry<Integer, Integer>> keySet = new ArrayList<>(map.entrySet());
        keySet.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));

        // 개수가 많은 순부터 사용
        for (Map.Entry<Integer, Integer> entry : keySet) {
            if(count<=0){
                break;
            }else{
                answer++;
                count -= entry.getValue();  
            }
        }


        return answer;
    }
}

다른 분 푼 거 보니까 map.entry 썼길래 이걸로 바꿔서 통과...

저것은 Java8에서 나온 Map.Entry 객체 컬렉션인데
저렇게 루프 돌리는게 효율적인가 보다!

용도는 Map을 For문에서 돌려줄 때 쓰는 거시다!
sort 람다 식으로 나와있어서 편하다 싶었는데 루프도 있었구만!




댓글