[プログラマー]ベストアルバム-Python


▼▼▼問題説明
ストリーミングサイトでは、最も多く再生された曲を2曲集め、ベストアルバムを発売します.曲は唯一の番号で区切られており、収録曲の基準は以下の通りである.
1.いろんな曲が流れているタイプを収録.
2.ジャンル内で放送される曲が多い.
3.タイプ内で同じ再生回数の曲のうち、固有番号の低い曲を優先的に収録する.
曲タイプを表す文字列配列タイプと、曲の再生回数を表す整数配列シナリオを指定する場合は、solution関数を完了し、最適なアルバムを入れる曲の一意の番号を順番に返します.
▼▼▼制限
  • タイプ[i]は、固有番号iの楽曲タイプである.
  • play[i]は、唯一i番の曲が再生された回数である.
  • ジャンルはシナリオと同じ長さで、1以上10000以下である.
  • タイプは100個未満です.
  • タイプの1曲なら1曲のみ.
  • すべてのタイプの再生回数が異なります.
  • 🎈 I/O例
    クラシックタイプは1450話を放送し、クラシック曲は以下の通りである.
  • ユニークナンバー3:800再生
  • ユニークナンバー0:500再生
  • ユニークナンバー2:150再生
  • popタイプは3100回再生され、pop曲は以下の通りである.
  • ユニークナンバー4:2500再生
  • ユニークナンバー1:600再生
  • そこで、まずポップタイプの[4,1]番の曲を収録し、クラシックタイプの[3,0]番の曲を収録します.
    👩‍💻 マイコード
    これはhashアルゴリズムを用いて解く問題である.
    そこで、ディック・シャナリーを利用して問題を解きます.
    def solution(genres, plays):
        album = {}
        sum = {} # 각 장르의 재생 횟수 합계
        
        # [('pop', 3100), ('classic', 1450)] 형태로 만들어 주기 위한 for 문
        for i in range(len(genres)):
            if genres[i] not in album:
                album[genres[i]] = [(plays[i], i)]
                sum[genres[i]] = plays[i]
            else:
                album[genres[i]].append((plays[i], i))
                sum[genres[i]] += plays[i]
        
        # 1. 많이 재생된 장르를 구하기 위한 정렬
        sort_sum = sorted(sum.items(), key=lambda x:x[1], reverse=True)
        
        # 2. 장르 안에서 가장 많이 재생된 앨범을 구하기 위한 정렬
        for key in album.keys():
            album[key].sort(key = lambda x:x[0], reverse=True)
            
        # 3. 많이 재생된 장르와 그 중 많이 재생된 앨범 구하기
        result = []
        for i in sort_sum:
            for a_key in album.keys():
                if i[0] == a_key:
                    if len(a_key) > 1: # 장르에 곡이 1개 이상일 경우
                        result.append(album[a_key][0][1])
                        result.append(album[a_key][1][1])
                    else: # 장르에 곡이 1개밖에 없을 경우
                        result.append(album[a_key][0][1])
        return result
    上記コード作成の結果,15個のテストで1,2,4,8,9,11,12にランタイムエラーが発生した.😭
    何か問題があるかもう一度考えて、コードを修正しなければなりません.
    後で調べてみると、運転中にドアを探しに行ったことが多すぎたためです.
    そのため、プレイ回数の総和を単独でリストに並べて計算するのではなく、(タイプ、プレイ回数の総和)自体をキー値として修正して計算を容易にします.
    def solution(genres, plays):
        album = {}
        sum = {}
        
        for i in range(len(genres)):
            if genres[i] not in album:
                album[genres[i]] = [(plays[i], i)]
                sum[genres[i]] = plays[i]
            else:
                album[genres[i]].append((plays[i], i))
                sum[genres[i]] += plays[i]
        
        sort_sum = sorted(sum.items(), key=lambda x:x[1], reverse=True)
        # print("sort_sum = ", sort_sum)
        
        for key in album.keys():
            album[key].sort(key = lambda x:x[0], reverse=True)
        
        # print("album = ", album)
        
        result_dic = {}
        for i in sort_sum:
            for a_key in album.keys():
                if i[0] == a_key:
                    result_dic[i] = album[a_key]
        print("result_dic = ", result_dic)
        
        result = []
        
        for value in result_dic.values():
            if len(value) > 1:
                for i in range(2):
                    result.append(value[i][1])
            else:
                result.append(value[0][1])
    
        return result

    非常に似たようなコードですが、少し方法を変えれば結果は大きく変わるようです.
    アルゴリズムが脆弱な私は想像以上にエラーを解決しやすく、とても喜んでいます.😂