Algorithm/Programmers
[Programmers] 베스트앨범
goakgoak
2020. 4. 24. 01:54
[Level 3] 베스트앨범
https://programmers.co.kr/learn/courses/30/lessons/42579
- 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려한다.
- 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같다.
- 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
- 노래의 장르를 나타내는 genres[]와 노래별 재생 횟수를 나타내는 plays[]가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하시오.
Solution
- HashMap의 key는 장르이름, value로는 genreList의 index를 가짐
- Genre 마다 내부적으로 리스트를 만들어 같은 Genre의 노래를 저장하고, 우선순위를 위한 totalPc 변수도 생성
- GenreList를 totalPc를 기준으로 내림차순으로 정렬하고, list에서 두 개씩 뽑아 playList에 추가
소스코드
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class Solution {
static Map<String, Integer> map;
static List<Genre> genreList;
static List<Integer> playList;
static int[] answers;
static class Song implements Comparable<Song> {
private int id;
private int pc;
public Song(int id, int pc) {
this.id = id;
this.pc = pc;
}
@Override
public int compareTo(Song o) {
return (o.pc > this.pc) ? 1 : (o.pc == this.pc) ? (this.id - o.id) : -1;
}
}
static class Genre implements Comparable<Genre> {
private String name;
private int count = 0;
private int totalPc = 0;
private List<Song> list;
public Genre(String name, int count, int id) {
list = new LinkedList<>();
this.name = name;
addSong(id, count);
}
public void addSong(int id, int pc) {
list.add(new Song(id, pc));
this.totalPc += pc;
this.count++;
}
@Override
public int compareTo(Genre o) {
return o.totalPc - this.totalPc;
}
}
static int[] solution(String[] genres, int[] plays) {
init();
int index = 0;
for (int i = 0; i < genres.length; i++) {
if (map.containsKey(genres[i])) {
genreList.get(map.get(genres[i])).addSong(i, plays[i]);
} else {
map.put(genres[i], index);
genreList.add(new Genre(genres[i], plays[i], i));
index++;
}
}
Collections.sort(genreList);
addPlayList();
return answers;
}
static void addPlayList() {
for (Genre g : genreList) {
Collections.sort(g.list);
int count = 0;
while (count < 2) {
playList.add(g.list.get(count).id);
count++;
if (g.count < 2) {
break;
}
}
}
answers = new int[playList.size()];
for (int i = 0; i < playList.size(); i++) {
answers[i] = playList.get(i);
}
}
static void init() {
map = new HashMap<>();
genreList = new LinkedList<>();
playList = new LinkedList<>();
}
}
|
cs |