알고리즘/프로그래머스

베스트앨범 **

베리영young 2024. 4. 11. 08:33

사용 알고리즘 : 해시

사용 언어: java

 

다시 풀어보기~!

import java.util.*;

class Solution {
    
    static class Music {
        String genre; //노래의 장르
        int play; //노래 재생 횟수
        int idx; //노래 고유 번호
        public Music(String genre, int play, int idx) {
            this.genre = genre;
            this.play = play;
            this.idx = idx;
        }
    }
    
    public int[] solution(String[] genres, int[] plays) {
        
        // map: 먼저 나올 장르 순서 찾기 위한 밑작업
        HashMap<String, Integer> map = new HashMap();
        for(int i=0; i<genres.length; i++) {
            // map에 이미 있는 장르라면, 기존 값에 + plays[i]
            // map에 아직 없는 장르라면, 0 + plays[i]
            map.put(genres[i], 
                    map.getOrDefault(genres[i], 0)+plays[i]);
        }
        
        // 1. 장르 선정 (map을 plays합으로 정렬)
        ArrayList<String> genres_ordered = new ArrayList<>();
        while(map.size() != 0) {
            int max = -1;
            String max_key = "";
            for(String key : map.keySet()) {
                //맵의 key에 해당하는 총 음악 재생 횟수
                //총 재생횟수 가장 많은 장르부터 꺼내기~~!
                int tmp_cnt = map.get(key);
                if(tmp_cnt > max) {
                    max = tmp_cnt;
                    max_key = key;
                }
            }
            genres_ordered.add(max_key); //집어 넣고
            map.remove(max_key); //꺼내기
        }
        
        
        //2. 장르 내 노래 선정 (탑2)
        ArrayList<Music> result = new ArrayList<>();
        //장르 돌면서~
        for(String gern : genres_ordered) {
            //장르에 해당하는 애들 중에 2개 뽑기 밑작업
            ArrayList<Music> list = new ArrayList<>();
            for(int i=0; i<genres.length; i++) {
                if(genres[i].equals(gern)) {
                    //일단 넣기
                    list.add(new Music(gern, plays[i], i));
                }
            }
            Collections.sort(list, (o1, o2) -> o2.play - o1.play); //장르별 내림차순 소팅, 람다식연습
            result.add(list.get(0)); //1개는 무조건 수록됨
            if(list.size() > 1) result.add(list.get(1));
        }
        
        //List에 저장한 답을 Array로 변환해서 반환
        int[] answer = new int[result.size()];
        for(int i=0; i<result.size(); i++) {
            answer[i] = result.get(i).idx;
        }
        return answer;
    }
}