https://programmers.co.kr/learn/courses/30/lessons/42579
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
Lv3 예제이고, 주어진 genres, plays 배열을 참고하여 아래와 같은 우선순위, 제한사항이 맞춰 베스트 앨범에 들어갈 노래 고유번호를 return 하는 solution 함수를 완성하는게 문제 목표이다.
우선순위
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
제한사항
- genres[i]는 고유번호가 i인 노래의 장르입니다.
- plays[i]는 고유번호가 i인 노래가 재생된 횟수입니다.
- genres와 plays의 길이는 같으며, 이는 1 이상 10,000 이하입니다.
- 장르 종류는 100개 미만입니다.
- 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
- 모든 장르는 재생된 횟수가 다릅니다.
해결 방법으로는 Java 에서 제공하는 Map과 List, Sort 를 활용해서 해결할 수 있다.
다만 유의해야 될 것으로 장르 내 재생횟수가 같을 경우에는 고유 번호가 낮은 순으로 먼저 수록한다는 점이다.
테스트케이스를 돌려볼때는 특이한 점이 없었지만, 만약 고유 번호가 높은 순으로 먼저 수록한다고 하였을 때의 코드를 따로 구현해봐도 좋을 것 같다.
예제 코드는 아래와 같습니다.
(예제코드)
- 내림차순으로 정렬할 경우에는 Comparator.reverseOrder() 를 활용하면 큰 도움이 됩니다.
import java.util.*;
class Solution {
public static int[] solution(String[] genres, int[] plays) {
List<Integer> answer = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
Map<String, Map<Integer,Integer>> entryMap = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
Map<Integer,Integer> defaultMap = new HashMap<>();
map.put(genres[i],map.getOrDefault(genres[i],0)+plays[i]);
if (entryMap.get(genres[i]) != null) {
defaultMap = entryMap.get(genres[i]);
}
defaultMap.put(i, plays[i]);
entryMap.put(genres[i], defaultMap);
}
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
list.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
for (Map.Entry<String, Integer> entry : list) {
Map<Integer,Integer> genresMap = entryMap.get(entry.getKey());
List<Map.Entry<Integer,Integer>> genreDetail = new ArrayList<>(genresMap.entrySet());
genreDetail.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
if (genreDetail.size() == 1) answer.add(genreDetail.get(0).getKey());
else {
answer.add(genreDetail.get(0).getKey());
answer.add(genreDetail.get(1).getKey());
}
}
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}'코딩테스트' 카테고리의 다른 글
| [프로그래머스] 추석 트래픽 (0) | 2022.04.25 |
|---|---|
| [프로그래머스] 키패드 누르기 (0) | 2022.04.07 |
| [프로그래머스] 더 맵게 (0) | 2022.03.29 |
| [프로그래머스] 전화번호 목록 (0) | 2022.03.29 |
| [프로그래머스] 단어 변환 (0) | 2022.03.29 |