ALGORITHM/PROGRAMMERS

[프로그래머스] 베스트앨범

0298 2021. 1. 23. 19:16

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

 

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

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

programmers.co.kr

2021-01-23


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.util.*;
 
public class Solution42579 {
    public static int[] solution(String[] genres, int[] plays) {
          HashMap<String, Integer> map = new HashMap<>();
          int maxLength = 0;
          for(int i = 0; i < genres.length; i++) { // 각 장르의 재생횟수 합치기
              if(map.containsKey(genres[i])) {
                  map.put(genres[i], map.get(genres[i])+plays[i]);
              } else map.put(genres[i], plays[i]);
              maxLength = Math.max(maxLength, map.get(genres[i]));
          }
 
          List<String> keySetList = new ArrayList<>(map.keySet()); // list에 넣고
          
          Collections.sort(keySetList, new Comparator<String>() { // 재생횟수 순으로 오름차순 정리 
              @Override 
              public int compare(String o1, String o2) {
                  return map.get(o2) - map.get(o1); 
              }
          });
          
         ArrayList<Integer> list = new ArrayList<>(); 
         for(int i = 0; i < keySetList.size(); i++) { // 장르 순서대로 돌면서 
             int idx = 0;
             int arr[][] = new int[maxLength][2];
             for(int j = 0; j < genres.length; j++) { 
                 if(genres[j].equals(keySetList.get(i))) { // 같은 장르
                     arr[idx][0= plays[j];
                     arr[idx++][1= j;
                 }
             }
             Arrays.sort(arr, new Comparator<int[]>() {
                @Override
                public int compare(int[] o1, int[] o2) {
                    return o2[0- o1[0]; // 재생횟수 기준으로 오름차순
                }
            });
            
            if(arr[0][0!= 0) list.add(arr[0][1]);
            if(genres.length > 1 && arr[1][0!= 0) list.add(arr[1][1]);
            // 4번 : 하나인 경우 이 설정 안 해주면 런타임 에러 
         }
         int answer[] = new int[list.size()];
         for(int i = 0; i < list.size(); i++) answer[i] = list.get(i);
         
        return answer;
    }
    
    public static void main(String[] args) {
        String g[] = {"classic""pop""classic""classic""pop"};
        int p[] = {5006001508002500};
//        String g[] = {"classic","jazz","music","rap","pop"};
//        int p[] = {500,150,600,800,2500};
//        String g[] = {"classic"};
//        int p[] = {500};
        System.out.println(Arrays.toString(solution(g, p)));
    }
}
 
cs

#문제풀이

문제를 간단히 쪼개서 생각하면,

(1) 장르별 재생횟수의 합을 오름차순으로 정렬한다.

(2) 각 장르의 노래별 재생횟수를 오름차순으로 정렬한다. 

로 나눠서 생각할 수 있다.

 

첫 번째는 hashmap을 이용하였고, 두 번째는 2차원 배열을 이용하였다. 

 

 

+) 4번에서 런타임 에러가 났었는데, 로직에서 틀린 것 같지는 않아서 혹시나 genres의 길이가 1인 배열을 넣어봤더니 41번에서 틀렸었던 것이다. 총 갯수가 1개 밖에 없을 때도 체크를 해야한다.