<Lv.3> 베스트앨범 (프로그래머스 : C#)

이도희·2023년 8월 5일
0

알고리즘 문제 풀이

목록 보기
144/185

https://school.programmers.co.kr/learn/courses/30/lessons/42579

📕 문제 설명

장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시할 때 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 반환하기

노래 수록 기준
1. 속한 노래가 많이 재생된 장르 먼저
2. 장르 내에서 많이 재생된 노래 먼저
3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래 먼저

  • Input
    노래 장르 배열, 노래별 재생 횟수
  • Output
    베스트 앨범에 들어갈 노래의 고유 번호 순서대로 반환

예제

풀이

단순 구현

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();
    }
}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글