Skip to content

Commit 7c90f86

Browse files
committed
[level 3] Title: 베스트앨범, Time: 19.06 ms, Memory: 74.5 MB -BaekjoonHub
1 parent 3f4a309 commit 7c90f86

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# [level 3] 베스트앨범 - 42579
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/42579)
4+
5+
### 성능 요약
6+
7+
메모리: 74.5 MB, 시간: 19.06 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 해시
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 09월 01일 17:02:31
20+
21+
### 문제 설명
22+
23+
<p>스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.</p>
24+
25+
<ol>
26+
<li>속한 노래가 많이 재생된 장르를 먼저 수록합니다.</li>
27+
<li>장르 내에서 많이 재생된 노래를 먼저 수록합니다.</li>
28+
<li>장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.</li>
29+
</ol>
30+
31+
<p>노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요.</p>
32+
33+
<h5>제한사항</h5>
34+
35+
<ul>
36+
<li>genres[i]는 고유번호가 i인 노래의 장르입니다.</li>
37+
<li>plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.</li>
38+
<li>genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.</li>
39+
<li>장르 종류는 100개 미만입니다.</li>
40+
<li>장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.</li>
41+
<li>모든 장르는 재생된 횟수가 다릅니다.</li>
42+
</ul>
43+
44+
<h5>입출력 예</h5>
45+
<table class="table">
46+
<thead><tr>
47+
<th>genres</th>
48+
<th>plays</th>
49+
<th>return</th>
50+
</tr>
51+
</thead>
52+
<tbody><tr>
53+
<td>["classic", "pop", "classic", "classic", "pop"]</td>
54+
<td>[500, 600, 150, 800, 2500]</td>
55+
<td>[4, 1, 3, 0]</td>
56+
</tr>
57+
</tbody>
58+
</table>
59+
<h5>입출력 예 설명</h5>
60+
61+
<p>classic 장르는 1,450회 재생되었으며, classic 노래는 다음과 같습니다.</p>
62+
63+
<ul>
64+
<li>고유 번호 3: 800회 재생</li>
65+
<li>고유 번호 0: 500회 재생</li>
66+
<li>고유 번호 2: 150회 재생</li>
67+
</ul>
68+
69+
<p>pop 장르는 3,100회 재생되었으며, pop 노래는 다음과 같습니다.</p>
70+
71+
<ul>
72+
<li>고유 번호 4: 2,500회 재생</li>
73+
<li>고유 번호 1: 600회 재생</li>
74+
</ul>
75+
76+
<p>따라서 pop 장르의 [4, 1]번 노래를 먼저, classic 장르의 [3, 0]번 노래를 그다음에 수록합니다.</p>
77+
78+
<ul>
79+
<li>장르 별로 가장 많이 재생된 노래를 최대 두 개까지 모아 베스트 앨범을 출시하므로 2번 노래는 수록되지 않습니다.</li>
80+
</ul>
81+
82+
<p>※ 공지 - 2019년 2월 28일 테스트케이스가 추가되었습니다.</p>
83+
84+
85+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import java.util.*;
2+
class Solution {
3+
public int[] solution(String[] genres, int[] plays) {
4+
int length = genres.length;
5+
// 장르의 재생 횟수
6+
HashMap<String,Integer> genreMap = new HashMap<>();
7+
// 노래별 수록번호, 재생 횟수
8+
HashMap<String,List<int[]>> songsMap = new HashMap<>();
9+
10+
for(int i = 0; i< length; i++){
11+
String genre = genres[i];
12+
int cnt = plays[i];
13+
14+
genreMap.put(genre, genreMap.getOrDefault(genre,0) + cnt);
15+
16+
int[] info = {i,cnt};
17+
// 기존에 이미 등록된 장르
18+
if(songsMap.containsKey(genre)){
19+
songsMap.get(genre).add(info);
20+
} else{
21+
List<int[]> newSongList = new ArrayList<>();
22+
newSongList.add(info);
23+
songsMap.put(genre,newSongList);
24+
}
25+
}
26+
27+
// 정렬(장르 재생 횟수 기준 내림차순)
28+
List<String> sortedGenres = new ArrayList<>(genreMap.keySet());
29+
Collections.sort(sortedGenres, new Comparator<String>(){
30+
@Override
31+
public int compare(String s1, String s2){
32+
return genreMap.get(s2) - genreMap.get(s1);
33+
}
34+
});
35+
36+
List<Integer> best = new ArrayList<>();
37+
for(String genre: sortedGenres){
38+
List<int[]> values = songsMap.get(genre);
39+
40+
Collections.sort(values, new Comparator<int[]>(){
41+
@Override
42+
public int compare(int[] s1, int[] s2){
43+
if(s1[1] == s2[1]){ // 재생 횟수가 같다면 고유 번호 기준 오름차순
44+
return s1[1] - s2[1];
45+
}
46+
47+
return s2[1] - s1[1];
48+
}
49+
});
50+
51+
int cnt = 0;
52+
for(int[] value : values){
53+
if(cnt > 1) break;
54+
int number = value[0]; // 고유 번호
55+
best.add(number);
56+
cnt ++;
57+
}
58+
}
59+
60+
// System.out.print("베스트 앨범: " + best);
61+
62+
63+
// for(String key: songsMap.keySet()){
64+
// System.out.print("key: " + key+", value:");
65+
// List<int[]> values = songsMap.get(key);
66+
// for(int[] value: values){
67+
// System.out.print(" " + Arrays.toString(value));
68+
// }
69+
// System.out.println("");
70+
// }
71+
72+
73+
return best.stream()
74+
.mapToInt(Integer::intValue)
75+
.toArray();
76+
}
77+
}

0 commit comments

Comments
 (0)