알고리즘/코딩테스트

프로그래머스 베스트앨범

호두밥 2021. 9. 25. 00:16

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

 

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

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

programmers.co.kr

import java.util.*;

class Solution {
    HashMap<String, Integer> genreSum;

    public int[] solution(String[] genres, int[] plays) {
       genreSum = new HashMap<>();
		List<Play> playList = new ArrayList<>();
 		
		for(int i = 0; i<genres.length; i++) {
			genreSum.put(genres[i], genreSum.getOrDefault(genres[i], 0)+(plays[i])) ;
			playList.add(new Play(i, genres[i], plays[i]));
		}
		
		Collections.sort(playList);
		
		List<Integer> answer = new ArrayList<>();
		int genreCnt = 0;
		String genre = null;
		for(int i = 0; i<genres.length; i++) {
			
			Play play =  playList.get(i);			
				
			if(null == genre || !genre.equals(play.genre)) {
				genre = play.genre;
				genreCnt = 0;
			}
			
			if(genre.equals(play.genre) && genreCnt < 2) {
				answer.add(play.index);
				genreCnt++;
				genre = play.genre;
			}
		}
		
		return answer.stream().mapToInt(i -> i).toArray();
    }
    
    class Play implements Comparable<Play> {
		Integer index;
		Integer count;
		String genre;
		public Integer getIndex() {
			return index;
		}
		public void setIndex(Integer index) {
			this.index = index;
		}		
		public Integer getCount() {
			return count;
		}
		public void setCount(Integer count) {
			this.count = count;
		}
		public String getGenre() {
			return genre;
		}
		public void setGenre(String genre) {
			this.genre = genre;
		}
		public Play(Integer index, String genre, Integer count) {
			super();
			this.index = index;
			this.count = count;
			this.genre = genre;
		}
		
		@Override
		public int compareTo(Play o) {
			int indexCompare = this.index - o.index;
			int countCompare = this.count - o.count;
			int genreCompare = genreSum.get(this.genre) - genreSum.get(o.genre);
			
			int compare = 0;
			
			if(genreCompare != 0) compare = genreCompare*-1;
			else if(countCompare != 0) compare = countCompare*-1;
			else compare = indexCompare;
			return compare;
		}
		
		
	}
}