베스트 앨범 (프로그래머스 : C#)

이도희·2022년 8월 16일
0

알고리즘 문제 풀이

목록 보기
2/185

문제 설명

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

  • Rules

→ 노래 수록 기준

  1. 속한 노래가 많이 재생된 장르 먼저
  2. 장르 내에서 많이 재생된 노래 먼저
  3. 재생 횟수 같으면 고유 번호 낮은 노래 먼저
  • Examples

→ classic 장르는 1450회 재생, pop 장르는 3100회 재생 → 장르 순서는 pop 다음 classic

→ 각 노래 안에서 2번 rule에 적용되어 4,1,3,0 순서로 앨범 수록

  • Input

노래 별 장르, 노래 별 재생 횟수

  • Output

베스트 앨범에 들어갈 노래의 고유번호를 순서대로 반환

풀이

리스트의 Add function은 void를 반환한다! → 특정 변수에 넣을려고 시도시 에러남

내림차순 정렬: sort + reverse 사용

using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
    public int[] solution(string[] genres, int[] plays) {
        List<int> answer = new List<int>();
        // 1번 룰 적용 위한 장르 내 total song 개수 저장 위한 dictionary
        Dictionary<string,int> totalPlayDict = new Dictionary<string,int>();
        // 2,3번 룰 적용 위한 장르를 key로 하고 해당되는 song을 순서로 담고 있음 
        Dictionary<string,List<int>> genreDict = new Dictionary<string,List<int>>(); 
        // 최종 결과 추출 위해 song 개수와 index 반환 
        Dictionary<int, List<int>> originDict = new Dictionary<int,List<int>>();
        
        // 초기화
        for(int i = 0; i < genres.Length; i++)
        {
            if(originDict.ContainsKey(plays[i])){originDict[plays[i]].Add(i);}
            else{originDict[plays[i]] = new List<int>{i};}
            
            
            if(totalPlayDict.ContainsKey(genres[i])){totalPlayDict[genres[i]] += plays[i];}
            else{totalPlayDict[genres[i]] = plays[i];}
            
            if(genreDict.ContainsKey(genres[i])){genreDict[genres[i]].Add(plays[i]);}
            else{genreDict[genres[i]] = new List<int>{plays[i]};}
            
        }
				// 전체 노래 개수 고려해서 정렬해놓은 딕셔너리
        var orderDict = totalPlayDict.OrderByDescending(x => x.Value);
        foreach(KeyValuePair<string,int> dict in orderDict)
        {
            var songList = genreDict[dict.Key];
            songList.Sort();
            songList.Reverse();
            int total = 0;
            for(int i = 0; i < songList.Count; i++)
            {
                if(i == 2){break;}
                if(originDict[songList[i]].Count > 1)
                {
                    for(int j = 0; j < originDict[songList[i]].Count; j++)
                    {
                        if(total == 2) {break;}
                        if(genres[originDict[songList[i]][j]] == dict.Key)
                        {
                            answer.Add(originDict[songList[i]][j]);
                            total += 1;
                        }
                    }
                }
                else
                {
                    answer.Add(originDict[songList[i]][0]);
                    total += 1;
                }
            }
            
        }

        return answer.ToArray();
    }
}

테스트

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

0개의 댓글