https://school.programmers.co.kr/learn/courses/30/lessons/42579
장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시할 때 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 반환하기
노래 수록 기준
1. 속한 노래가 많이 재생된 장르 먼저
2. 장르 내에서 많이 재생된 노래 먼저
3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래 먼저
단순 구현
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public int[] solution(string[] genres, int[] plays) {
int n = genres.Length;
// 재생횟수 확인용
Dictionary<string, int> playsFromGenre = new Dictionary<string, int>();
// 장르별 음악 리스트 index 담은것
Dictionary<string, List<int>> musicFromGenre = new Dictionary<string, List<int>>();
// 장르별 음악 리스트 index 담은것 (재생횟수 기준으로 정렬된것)
Dictionary<string, List<int>> sortedMusicFromGenre = new Dictionary<string, List<int>>();
for (int i = 0; i < n; i++)
{
string currentGenre = genres[i];
if (playsFromGenre.TryGetValue(currentGenre, out var playsCount))
{
playsFromGenre[currentGenre] += plays[i];
}
else
{
playsFromGenre[currentGenre] = plays[i];
}
if (musicFromGenre.TryGetValue(currentGenre, out var musicList))
{
musicFromGenre[currentGenre].Add(i);
}
else
{
musicFromGenre[currentGenre] = new List<int>();
musicFromGenre[currentGenre].Add(i);
}
}
List<int> answer = new List<int>(playsFromGenre.Keys.Count * 2); // capacity 초기화해둠
var sortedPlaysFromGenre = playsFromGenre.OrderByDescending(x => x.Value); // 재생횟수 기준 장르 정렬
// 각 장르별 음악들을 재생횟수 별로 정렬
foreach(string genre in musicFromGenre.Keys)
{
sortedMusicFromGenre[genre] = musicFromGenre[genre].OrderByDescending(x => plays[x]).ToList();
}
foreach(var info in sortedPlaysFromGenre) // 재생횟수 많은 장르 순서로 뽑혀나옴
{
string genre = info.Key;
List<int> currentGenreMusicList = sortedMusicFromGenre[genre]; // 현재 장르 기준 재생횟수 별 정렬된 음악 리스트
answer.Add(currentGenreMusicList[0]);
if (currentGenreMusicList.Count > 1) // 음악 리스트 내 음악 2개 이상인 경우 하나 더 추가
{
answer.Add(currentGenreMusicList[1]);
}
}
return answer.ToArray();
}
}