본문 바로가기

Algorithm/Practice

Programmers - 베스트 엘범 with JAVA

 

 

프로그래머스에 있는 문제 중 베스트 엘범이라는 문제에 대해서 블로그를 작성하고자 한다.

 

 

문제

1. 장르에 속한 곡들의 플레이수 합이 높을 수록 먼저 출력

2. 장르에 속한 곡들 사이 플레이수가 높을 수록 먼저 출력

3. 최대 장르당 2개 출력

4. 인덱스를 출력

5. 장르에 속한 곡이 하나면 하나만 출력

 

 

 

해결

1. 장르별 합, 인덱스 리스트 처리

2. 합 별로 정렬

3. 해당 장르의 인덱스들 불러와 크기별로 정렬

4. 출력

(만약 장르에 속한 음악의 수가 1이면 그대로 출력)

 

 

 

코드

import java.util.*;
class Solution {
    public List<Integer> solution(String[] genres, int[] plays) {
        List<Integer> answer = new ArrayList<>();
        HashMap<String, Integer> sum = new HashMap<>();
        HashMap<String, List<List<Integer>>> check = new HashMap<>();
        for(int i=0; i<genres.length; i++){
            if(check.get(genres[i]) == null){
                List<List<Integer>> now = new ArrayList<>();
                now.add(Arrays.asList(plays[i], i));
                check.put(genres[i], now);
                sum.put(genres[i], plays[i]);
                continue;
            }
            check.get(genres[i]).add(Arrays.asList(plays[i], i));
            sum.put(genres[i], sum.get(genres[i])+plays[i]);
        }
        List<Integer> values = new ArrayList<>();
        for(String key : sum.keySet()){
            values.add(sum.get(key));
        }
        Collections.sort(values, Comparator.comparing(arr -> -arr));
        for(int value : values){
            for(String genre : sum.keySet()){
                if(sum.get(genre) == value){
                    List<List<Integer>> now = check.get(genre);
                    Collections.sort(now, Comparator
                              .comparing((List<Integer> arr) -> -arr.get(0))
                              .thenComparing(arr -> arr.get(1)));
                    if(now.size() == 1){
                        answer.add(now.get(0).get(1));
                        continue;
                    }
                    for(int i=0; i<2; i++){
                        answer.add(now.get(i).get(1));
                    }
                }
            }
        }
        return answer;
    }
}