코딩/알고리즘

[알고리즘] 프로그래머스 베스트앨범 JAVA(자바)

유어노우 2021. 10. 29. 07:18

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

 

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

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

programmers.co.kr

 

최적의 코드도 좋지만 이해하기 쉬운 코드를 짜고 싶다는 생각을 가지고 있다.

그런면에서 이번 코드는 실패한 느낌...

 

< 코드설명>

 played 변수에 <장르,총 플레이 횟수>가 최종적으로 저장이 됨

genres_ordered에 총 플레이 횟수를 기준으로 내림차순으로 정렬이됨

Song 클래스를 만들고 result 변수를 통해 장르별로 곡을 저장하고 -> 이후에 재생횟수를 기준으로 내림차순으로 정렬

 tmp_result 변수에 장르별 최대 2곡의 이름을 저장

 

마지막으로 tmp_result 사이즈 만큼 answer의 크기를 할당한 후 옮겨준다.

import java.util.*;
import java.util.Map.Entry;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        HashMap <String,Integer> played  = new HashMap<>();
        
        //장르별 재생횟수를 구한다.
        for(int i=0; i<genres.length; i++){
            played.put(genres[i],played.getOrDefault(genres[i],0)+plays[i]);
        }
        
         //재생횟수가 많은 장르순으로 정렬
        List<Entry<String,Integer>> genres_ordered = new ArrayList<Entry<String,Integer>>(played.entrySet());
        Mycomparator comp = new Mycomparator(); 
        Collections.sort(genres_ordered, comp);
        
        
        ArrayList<ArrayList<Song>> result = new ArrayList<>();
        ArrayList<Integer> tmp_result = new ArrayList<>();
        
        
         //장르가 같은곡의 리스트를 만들어준다.
        for( Entry<String,Integer> gnr : genres_ordered){
            ArrayList<Song> rlist = new ArrayList<Song>();
            
            for(int j=0; j<genres.length; j++){
                if(gnr.getKey().equals(genres[j])){
                    rlist.add(new Song(genres[j],plays[j], j));
                }
            }
            
            Collections.sort(rlist);
            result.add(rlist);
            
            //각 장르별 최대 2곡을 리스트에 넣어줌
            if(rlist.size() >=2)
                for(int k=0; k<2; k++)tmp_result.add(rlist.get(k).idx);
            else 
                tmp_result.add(rlist.get(0).idx);
        }
        
        answer = new int[tmp_result.size()];
        for(int i=0; i<tmp_result.size(); i++){
            answer[i] = tmp_result.get(i);
        }
       
    
        return answer;
    }
    static class Song implements Comparable<Song>{
        String genre;
        int played;
        int idx;
        
        @Override
        public int compareTo(Song o2){
            if(this.played > o2.played) return -1;
            else if(this.played == o2.played){
                if(this.idx < o2.idx) return 1;
            }
            return 0;
        }
        
        public Song(String genre, int played, int idx){
            this.genre = genre;
            this.played = played;
            this.idx = idx;
        }
        
    }
    
    static class Mycomparator implements Comparator<Entry<String,Integer>> {
        @Override
        public int compare(Entry<String, Integer> o1, Entry<String,Integer> o2){
            if(o1.getValue() < o2.getValue()) return 1;
            else if(o1.getValue() == o2.getValue()) return 0;
            else 
                return -1;
        }
        
    }
}

 

문제 푸신 분들 보면 다양하고 깔끔하게 푸신 분들이 많으니 참고 해주시면 될거같습니다!