문제
- 문제 링크: 베스트 앨범
해설
- 자료구조:
- 시간복잡도:
(풀이과정)
1)
2)
3)
4)
코드
(C언어)
solution 1)
solution 1
#include<>
solution 2)
#include<>
solution 3)
#include<>
(C++)
solution 1)
#include<>
solution 2)
#include<>
solution 3)
#include<>
(C#)
solution 1)
#include<>
solution 2)
#include<>
solution 3)
#include<>
(Java)
solution 1)
- N: play와 genres의 길이
- G: 장르의 수
- 각 노래의 장르와 재생 횟수를 해시맵에 저장: O(N)
- 장르별 총 재생 횟수를 기준으로 정렬: O(GlogG)
- G는 최대 100이므로 상수로 고려하고 무시
- 각 장르 내에서 노래를 재생 횟수 순으로 정렬: O(NlogN)
- 최종 시간 복잡도: O(NlogN)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
public class Solution {
public int[] solution(String[] genres, int[] plays) {
HashMap<String, ArrayList<int[]>> genreMap = new HashMap<>();
HashMap<String, Integer> playMap = new HashMap<>();
// 장르별 총 재생 횟수와 각 곡의 재생 횟수 저장
for (int i = 0; i < genres.length; i++) {
String genre = genres[i];
int play = plays[i];
if (!genreMap.containsKey(genre)) {
genreMap.put(genre, new ArrayList<>());
playMap.put(genre, 0);
}
genreMap.get(genre).add(new int[]{i, play});
playMap.put(genre, playMap.get(genre) + play);
}
ArrayList<Integer> answer = new ArrayList<>();
// 총 재생 횟수가 많은 장르순으로 내림차순 정렬
Stream<Map.Entry<String, Integer>> sortedGenre = playMap.entrySet()
.stream()
.sorted((o1, o2) -> Integer.compare(o2.getValue(), o1.getValue()));
// 각 장르 내에서 노래를 재생 횟수 순으로 정렬해 최대 2곡까지 선택
sortedGenre.forEach(entry -> {
Stream<int[]> sortedSongs = genreMap.get(entry.getKey()).stream()
.sorted((o1, o2) -> Integer.compare(o2[1], o1[1]))
.limit(2);
sortedSongs.forEach(song -> answer.add(song[0]));
});
return answer.stream().mapToInt(Integer::intValue).toArray();
}
}
solution 2)
#include<>
solution 3)
#include<>
(Python)
solution 1)
- N: plays와 genres의 길이
- G: 장르의 수
- 각 노래의 장르와 재생 횟수를 딕셔너리에 저장: O(N)
- 장르별 총 재생 횟수를 기준으로 정렬하기 위한 시간 복잡도: O(GlogG)
- G는 최대 100이므로 상수로 고려하여 무시
- 각 장르 내에서 노래를 재생 횟수 순으로 정렬: O(NlogN)
- 최종 시간 복잡도: O(NlogN)
def solution(genres, plays):
answer = []
genres_dict = {}
play_dict = {}
# 장르별 총 재생 횟수와 각 곡의 재생 횟수 저장
for i in range(len(genres)):
genre = genres[i]
play = plays[i]
if genre not in genres_dict:
genres_dict[genre] = []
play_dict[genre] = 0
genres_dict[genre].append((i, play))
play_dict[genre] += play
# 총 재생 횟수가 많은 장르순 정렬
sorted_genres = sorted(play_dict.items(), key=lambda x: x[1], reverse=True)
# 각 장르 내에서 노래를 재생 횟수 순으로 정렬해 최대 2곡까지 선택
for genre, _ in sorted_genres:
sorted_songs = sorted(genres_dict[genre], key=lambda x: (-x[1], x[0]))
answer.extend([idx for idx, _ in sorted_songs[:2]])
return answer
solution 2)
import
solution 3)
import
(JavaScript)
solution 1)
- N: plays와 genres의 길이
- G: 장르의 수
- 각 노래의 장르와 재생 횟수를 오브젝트에 저장: O(N)
- 장르별 총 재생 횟수를 기준으로 정렬: O(GlogG). G는 최대 100이므로 상수로 고려하고 무시
- 각 장르 내에서 노래를 재생 횟수 순으로 정렬: O(NlogN)
- 최종 시간 복잡도: O(NlogN)
function solution(genres, plays) {
let answer = [];
const genresObj = {};
const playObj = {};
// 장르별 총 재생 횟수와 각 곡의 재생 횟수 저장
for (let i = 0; i < genres.length; ++i) {
genre = genres[i];
play = plays[i];
if (!(genre in genresObj)) {
genresObj[genre] = [];
playObj[genre] = 0;
}
genresObj[genre].push([i, play]);
playObj[genre] += play;
}
// 총 재생 횟수가 많은 장르순으로 정렬
sortedGenres = Object.keys(playObj).sort((a, b) => {
return playObj[b] - playObj[a];
});
// 각 장르 내에서 노래를 재싱 횟수 순으로 정렬해 최대 2곡까지 선택
for (const genre of sortedGenres) {
sortedSongs = genresObj[genre].sort((a, b) => {
return a[1] === b[1] ? a[0] - b[0] : b[1] - a[1];
});
answer.push(...sortedSongs.slice(0, 2).map((song) => song[0]));
}
return answer;
}
solution 2)
import
solution 3)
import
'1-4. 코딩테스트 문제집(진행중) > PCCP(Lv3)' 카테고리의 다른 글
[PCCP] Lv3: 양과 늑대(92343) 해설 (0) | 2024.12.25 |
---|---|
[PCCP] Lv3: 섬 연결하기(42861) 해설 (0) | 2024.12.24 |
[PCCP] Lv3: 길 찾기 게임(42892) 해설 (0) | 2024.12.24 |
[PCCP] Lv3: 다단계 칫솔 판매(77486) 해설 (0) | 2024.12.24 |
[PCCP] Lv3: 표 편집(81303) 해설 (0) | 2024.12.24 |