Skip to content

Commit 9aab50e

Browse files
committed
[level 3] Title: 베스트앨범, Time: 0.34 ms, Memory: 33.6 MB -BaekjoonHub
1 parent 335a854 commit 9aab50e

2 files changed

Lines changed: 130 additions & 0 deletions

File tree

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+
메모리: 33.6 MB, 시간: 0.34 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 해시
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2026년 04월 27일 14:44:22
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: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* 장르별 가장 많이 재생된 노래 두개 모으기
3+
* 노래는 고유번호로 구분
4+
*
5+
* 노래 수록 기준
6+
* 속한 노래가 많이 재생된 장르 먼저 수록
7+
* 장르에서 많이 재생된 노래 먼저 수록
8+
* 재생횟수 같으면 고유번호 낮은 노래 먼저 수록
9+
*
10+
* 장르에 속한 곡이 하나라면 하나의 곡만 선택
11+
**/
12+
13+
function solution(genres, plays) {
14+
const genreTotal = {}; // 장르별 총 재생 횟수
15+
const genreMap = {}; // 장르별 곡 정보 목록
16+
17+
genres.forEach((genre, i) => {
18+
const play = plays[i];
19+
genreTotal[genre] = (genreTotal[genre] || 0) + play;
20+
21+
if (!genreMap[genre]) genreMap[genre] = [];
22+
genreMap[genre].push({ id: i, play: play });
23+
});
24+
25+
const sortedGenres = Object.keys(genreTotal).sort((a, b) => {
26+
return genreTotal[b] - genreTotal[a];
27+
});
28+
29+
const result = [];
30+
31+
sortedGenres.forEach((genre) => {
32+
const songs = genreMap[genre];
33+
34+
songs.sort((a, b) => {
35+
if (a.play === b.play) {
36+
return a.id - b.id;
37+
}
38+
return b.play - a.play;
39+
});
40+
41+
result.push(...songs.slice(0, 2).map((song) => song.id));
42+
});
43+
44+
return result;
45+
}

0 commit comments

Comments
 (0)