하루에 한 문제

[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 베스트앨범 -Java 본문

알고리즘/프로그래머스

[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 베스트앨범 -Java

dkwjdi 2020. 12. 13. 20:40

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

 

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

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

programmers.co.kr

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
		class Info implements Comparable<Info>{
			int index, play;
			public Info(int index, int play) {
				this.index = index;
				this.play = play;
			}
			@Override
			public int compareTo(Info o) {
				if(o.play==this.play) return this.index-o.index;
				return o.play-this.play;
			}
		}
		
	    public int[] solution(String[] genres, int[] plays) {
	        
	        List<Integer> answerList= new ArrayList<>();
	        Map<String, Integer> bestGenre = new HashMap<>();
	        HashMap<String, List<Info>> playOfGenre = new HashMap<>();
	        
	        for(int i=0; i<genres.length; i++) {
	        	
	        	if(bestGenre.containsKey(genres[i])) bestGenre.put(genres[i], bestGenre.get(genres[i])+plays[i]);
	        	else bestGenre.put(genres[i], plays[i]);
	        	
	        	if(!playOfGenre.containsKey(genres[i])) playOfGenre.put(genres[i], new ArrayList<>());
	        	playOfGenre.get(genres[i]).add(new Info(i,plays[i]));
	        	
	        }
	        
	        List<String> totalPlayList = new ArrayList<>(bestGenre.keySet());
	        Collections.sort(totalPlayList, (o1, o2) -> (bestGenre.get(o2).compareTo(bestGenre.get(o1))));
	        
	        for(int i=0; i<totalPlayList.size(); i++) {
	        	String genre=totalPlayList.get(i);
	        	
	        	Collections.sort(playOfGenre.get(genre));
	        	
	        	if(playOfGenre.get(genre).size()==1) answerList.add(playOfGenre.get(genre).get(0).index);
	        	else {
	        		for(int j=0; j<2; j++) {
	        			answerList.add(playOfGenre.get(genre).get(j).index);
	        		}
	        	}
	        	
	        }
	        int[] answer= new int[answerList.size()];
	        int idx=0;
	       
	        for(int index : answerList) {
	        	answer[idx++]=index;
	        }
	        System.out.println(Arrays.toString(answer));
	        return answer;
	    }
	}

소요시간 : 1시간 

 

HashMap<String, Integer> bestGenre = new HashMap<>() 을 통해 가장 많이 재생된 장르를 찾았습니다.

HashMap<String, List<Info>> playOfGenre = new HashMap<>(); 를 통해 장르별 재생된 노래를 list로 넣었습니다.

 

playOfGenre를 List로 변경한뒤 Collections.sort를 통해 장르별 음악을 정렬합니다. 이 때 정렬 순서는 장르 내에서 가장 많이 재생된 노래를 기준으로 합니다.

 

각 장르별 노래를 저장하는데 아이디어가 쉽게 떠오르지 않아 시간이 조금 걸렸지만 이 부분만 빠르게 생각해낸다면 쉽게 풀 수 있는 문제인 것 같습니다.

Comments