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[] = {500, 600, 150, 800, 2500};
// 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개 밖에 없을 때도 체크를 해야한다.