[해시] 프로그래머스 베스트앨범 "JAVA"

라리·2021년 10월 11일
0

코딩테스트

목록 보기
24/29

🚀링크

https://programmers.co.kr/learn/courses/30/lessons/42579?language=java

💻문제

🌏문제풀이

1) 장르, 재생횟수, 인덱스 담을 Album 클래스 선언
2) getOrDefault() 활용하여 장르별 재생횟수 합 구함
3) Comparator 활용하여 재생횟수 내림차순 정렬
4) (3)의 key 순서대로, 동일한 장르의 곡을 temp_list에 저장
5) temp_list 재생횟수 내림차순, 인덱스 오름차순 정렬 후 1~2개 값 answer에 저장

👩‍💻코드

import java.util.*;

class Solution {
    class Album{
        String genre;
        Integer index;
        Integer play;
        
        public Album(String genre, Integer index, Integer play){
            this.genre = genre;
            this.index = index;
            this.play = play;
        }
        
        public String getGenre(){
            return this.genre;
        }
        
        public int getIndex(){
            return this.index;
        }
        
        public int getPlay(){
            return this.play;
        }
    }
    
    public int[] solution(String[] genres, int[] plays) {
        ArrayList<Album> temp_list = new ArrayList<>();
        ArrayList<Integer> temp_answer = new ArrayList<>();
        
        int[] answer;
        int max = Integer.MIN_VALUE;
        String maxGenre = "";
        
        HashMap<String ,Integer> genre = new HashMap<String, Integer>();
        ArrayList<Album> albums = new ArrayList<>();
        
        //장르별 재생횟수
        for(int i=0; i<genres.length; i++){
            genre.put(genres[i], genre.getOrDefault(genres[i], 0) + plays[i]);
        }
        
        //재생횟수 내림차수 정렬
        List<Map.Entry<String, Integer>> bestGenre = new ArrayList<>(genre.entrySet());
        bestGenre.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();   
            }
        });
        
        //많이 재생된 장르 순서대로 인덱스 구하기
        for(Map.Entry<String, Integer> k : bestGenre){
            //해당 장르의 재생횟수와 인덱스 저장
            for(int i=0; i<genres.length; i++){
                if(k.getKey().equals(genres[i])){
                    temp_list.add(new Album(genres[i], i, plays[i]));
                }
            }
            //재생횟수 내림차, 인덱스 오름차순 정렬
            temp_list.sort(new Comparator<Album>(){
               @Override
                public int compare(Album o1, Album o2){
                    if(o1.play == o2.play){
                        return o1.index - o2.index;
                    }else{
                        return o2.play - o1.play;
                    }
                }
            });
            
            //해당 장르 곡 1개일 때, 1개만 저장
            if(temp_list.size() == 1){
                temp_answer.add(temp_list.get(0).getIndex());
            }//해당 장르 곡 2개 이상일 때, 2개까지 저장
            else if(temp_list.size() > 1){
                temp_answer.add(temp_list.get(0).getIndex());
                temp_answer.add(temp_list.get(1).getIndex());
            }
            //배열 초기화
            temp_list.clear();
        }
        
        answer = new int[temp_answer.size()];
        for(int i=0; i<temp_answer.size(); i++){
            answer[i] = temp_answer.get(i);
        }
        
        return answer;
    }
}

0개의 댓글