Today I Learned

[프로그래머스] 해시 Level 3. 베스트앨범(JAVA) 본문

알고리즘 & 코딩테스트

[프로그래머스] 해시 Level 3. 베스트앨범(JAVA)

하이라이터 2021. 1. 21. 01:12
728x90

*풀이

1. 장르별 총 재생횟수를 넣는다.(Map)

2. 장르별 음악목록(재생횟수, 고유번호)을 넣는다.(Map)

3. 장르별 총 재생횟수를 정렬한다.

4. 해당하는 음악목록을 뽑는다.(ArrayList)

5. 음악목록을 재생횟수 순으로 정렬한다.

6. 베스트앨범에 순서대로 넣는다.

 

좀 더 간결하게 풀 수 있는 방법은 없을까?

 

코드

import java.util.*;
import java.util.Collections;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        ArrayList<Integer> bestMusic = new ArrayList<Integer>();
        Map<String, Integer> genresCnt = new HashMap<String, Integer>();
        Map<String, ArrayList> genresMusicList = new HashMap<String, ArrayList>();
        for(int i = 0; i < genres.length; i++){
            //장르별 재생횟수
            genresCnt.put(genres[i], genresCnt.getOrDefault(genres[i], 0) + plays[i]);
            
            //장르별 음악목록(횟수, 고유번호)
            ArrayList<Music> musicList = genresMusicList.get(genres[i]);
            if(musicList == null){
                musicList = new ArrayList<Music>();
            }
            musicList.add(new Music(plays[i], i));
            genresMusicList.put(genres[i], musicList);
        }
        
        //장르별 재생횟수 정렬
        List<Map.Entry<String, Integer>> genresSort = new LinkedList<>(genresCnt.entrySet());
        
        Collections.sort(genresSort, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        
        //장르별 베스트음악 추출
        for(Map.Entry<String, Integer> entry : genresSort) {
            ArrayList<Music> musicList = genresMusicList.get(entry.getKey());
            
            Collections.sort(musicList);
            bestMusic.add(musicList.get(0).playNo);
            if(musicList.size() > 1){
               bestMusic.add(musicList.get(1).playNo);
            }
        }
        
        answer = new int[bestMusic.size()];
        for(int i=0; i<bestMusic.size(); i++) {
            answer[i] = bestMusic.get(i);
        }    

        return answer;

    }
}
//Comparable 인터페이스를 구현하고 compareTo 메소드를 override하면 sort할 수 있다.
class Music implements Comparable<Music> {
    Integer playCnt;
    Integer playNo;

    public Music(int playCnt, int playNo) {
        this.playCnt = playCnt;
        this.playNo = playNo;
    }
    
    @Override
    public int compareTo(Music music) {
        return music.playCnt.compareTo(this.playCnt);
    }

}

결과

728x90
Comments