티스토리 뷰
프로그래머스 42579번 - 베스트앨범
요구사항
1. 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시한다.
2. 노래를 수록하는 기준은 다음과 같습니다.
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서 고유 번호가 낮은 노래를 먼저 수록합니다.
3. 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
4. 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 배열에 담아 반환하라.
요구사항 분석 및 풀이과정
1. 장르 별로 재생 횟수를 취합하여 어떤 장르가 가장 많이 재생되었는지를 구합니다.
2. 입력으로 주어진 각 노래의 장르와 재생 횟수를 장르에 맞게 분류합니다.
3. 장르 별로 분류된 노래 정보와 장르 별 재생 횟수를 이용하여 주어진 기준에 맞게 가장 많이 재생된 장르내에서 두 곡을 수록합니다.
3-1. 장르 별 재생 횟수를 이용하여 가장 많이 재생된 장르의 곡부터 수록합니다.
3-2. 장르 내에서 많이 재생된 노래를 먼저 수록하기 위하여, 각 장르별로 분류된 노래들의 재생 횟수를 기준으로 내림차순 정렬합니다.
3-3. 재생 횟수가 동일할 경우는 고유 번호를 기준으로 오름차순으로 정렬합니다.
소스코드 작성
class Solution {
private static class Genre implements Comparable<Genre> {
private final int id;
private final int play;
public Genre(int id, int play) {
this.id = id;
this.play = play;
}
public int getId() {
return id;
}
@Override
public int compareTo(Genre other) {
if (this.play == other.play) {
return this.id - other.id;
}
return other.play - this.play;
}
}
public int[] solution(String[] genres, int[] plays) {
final Map<String, Integer> freq = new HashMap<>();
for (int id = 0; id < genres.length; id++) {
freq.put(genres[id], freq.getOrDefault(genres[id], 0) + plays[id]);
}
Map<String, List<Genre>> statistics = new TreeMap<>((s1, s2) -> freq.get(s2) - freq.get(s1));
for (int id = 0; id < genres.length; id++) {
statistics.computeIfAbsent(genres[id], (key) -> new ArrayList<>()).add(new Genre(id, plays[id]));
}
List<Integer> result = new ArrayList<>();
for (List<Genre> songs : statistics.values()) {
Collections.sort(songs);
int length = Math.min(songs.size(), 2);
for (int idx = 0; idx < length; idx++) {
result.add(songs.get(idx).getId());
}
}
return result.stream().mapToInt(Integer::intValue).toArray();
}
}
결과
소스코드 깃허브 주소
'코딩테스트 > 알고리즘' 카테고리의 다른 글
[알고리즘]프로그래머스 77485번 - 행렬 테두리 회전하기 (0) | 2022.02.05 |
---|---|
[알고리즘]프로그래머스 12980번 - 점프와 순간 이동 (0) | 2022.02.02 |
[알고리즘]프로그래머스 49994번 - 방문 길이 (0) | 2022.01.30 |
[알고리즘]프로그래머스 17677번 - [1차] 뉴스 클러스터링 (0) | 2022.01.29 |
[알고리즘]프로그래머스 68645번 - 삼각 달팽이 (0) | 2022.01.28 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 비트연산
- set
- 쓰레드
- 우선순위큐
- BFS
- 코딩인터뷰
- 코드 스니펫
- 탐욕법
- dsu
- 연결리스트
- sql
- 스트림
- kotlin
- dfs
- k8s
- 구현
- 스택
- Uber
- 해쉬
- JPA
- dp
- 프로그래머스
- TDD
- 오늘의집
- 문자열
- 회고
- 알고리즘
- 정렬
- Java
- 카카오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함