본문 바로가기
Study Log/Algorithm

Programmers / Hash - 베스트 앨범

by HZie 2021. 8. 29.

 

https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

어떤식으로 정렬할지 감이 잘 안와서 걍 brute force로 풀었다.

 

[내가 짠 코드]

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        ArrayList<Integer> answerList = new ArrayList<>();
        HashMap<String, Integer> genrePlay = new HashMap<>();
        HashMap<Integer, Integer> song = new HashMap<>();
        
        for(int i = 0; i < genres.length; i++){
            genrePlay.put(genres[i], genrePlay.getOrDefault(genres[i], 0) + plays[i]);
            song.put(i, plays[i]);
        }
        
        List<Map.Entry<String, Integer>> entryList = new LinkedList<>(genrePlay.entrySet());
        entryList.sort(new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        });
        
        List<Map.Entry<Integer, Integer>> songList = new LinkedList<>(song.entrySet());
        songList.sort(new Comparator<Map.Entry<Integer, Integer>>(){
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2){
                return o2.getValue() - o1.getValue();
            }
        });
        
        for(Map.Entry<String, Integer> entry: entryList){
            String genre = entry.getKey();
            int count = 0;
            for(Map.Entry<Integer, Integer> songEntry: songList){
                if(count == 2)
                    break;
                int key = songEntry.getKey();
                if(genre.compareTo(genres[key]) == 0){
                    count++;
                    answerList.add(key);
                }
            }
        }
        
        int[] answer = new int[answerList.size()];
        for(int i = 0; i < answerList.size(); i++){
            answer[i] = answerList.get(i);
        }

        
        return answer;
    }
}

 

[오늘 배운 것]

해시 value 값으로 내림차순 정렬하기

1. 일단 entrySet()으로 링크드리스트를 만든다.

2. 링크드 리스트를 comparator를 이용해서 정렬한다.

  - 이 때, 내림차순으로 정렬할 경우 compare 메소드를 재정의한다.

[예시]

 entryList.sort(new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        });

 

댓글