title: "코딩테스트 연습 - 베스트앨범"
image: "https://image.freepik.com/free-vector/landing-page-template-for-a-website_23-2147782747.jpg"
description: "스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다."
url: "https://school.programmers.co.kr/learn/courses/30/lessons/42579"
문제 풀이
문제 접근
해시맵 사용
아래와 같음
간단한 수도 코드 정리
```pseudocode
각 장르별 총 재생 횟수 계산:
genreCount[장르] = 총 재생 횟수
각 장르별 상위 2개의 곡 찾기:
map[장르] = [가장 많이 재생된 곡들 (최대 2곡)]
장르별로 총 재생 횟수 내림차순 정렬:
genreRank = 장르 리스트를 genreCount 기준으로 내림차순 정렬
결과 리스트에 상위 곡들의 인덱스 추가:
for (장르 in genreRank) {
for (곡 in map[장르]) {
결과 리스트에 곡의 인덱스를 추가
해당 곡의 인덱스는 이미 선택된 곡으로 처리 } }
결과 리스트를 배열로 변환하여 반환:
return 결과 리스트를 배열로 변환
---
## 풀이 코드
```java
import java.util.*;
import java.util.stream.Collectors; // 추가
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
HashMap<String, List<Integer>> map = new HashMap<>();
HashMap<String, Integer> genreCount = new HashMap<>();
List<Integer> playList = Arrays.stream(plays)
.boxed() // int를 Integer로 변환
.collect(Collectors.toList()); // 리스트로 변환
// set map
for (int i = 0; i < genres.length; i++) {
// genresCount
if (genreCount.containsKey(genres[i])) {
genreCount.put(genres[i], genreCount.get(genres[i]) + plays[i]);
} else {
genreCount.put(genres[i], plays[i]);
}
// map
if (map.containsKey(genres[i])) {
if (map.get(genres[i]).size() < 2) {
map.get(genres[i]).add(plays[i]);
Collections.sort(map.get(genres[i]), Collections.reverseOrder());
} else {
if (plays[i] > map.get(genres[i]).get(0)) {
map.get(genres[i]).add(0, plays[i]);
map.get(genres[i]).remove(2);
} else if (plays[i] > map.get(genres[i]).get(1)) {
map.get(genres[i]).add(1, plays[i]);
map.get(genres[i]).remove(2);
}
}
} else {
List<Integer> list = new ArrayList<>();
list.add(plays[i]);
map.put(genres[i], list);
}
}
// sort genreCount
List<String> genreRank = new ArrayList<>(genreCount.keySet());
genreRank.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return genreCount.get(o2).compareTo(genreCount.get(o1));
}
});
List<Integer> result = new ArrayList<>();
for (String gen : genreRank) {
for (Integer play : map.get(gen)) {
result.add(playList.indexOf(play));
playList.set(playList.indexOf(play), -1);
}
}
answer = result.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}