ベストアルバム|プログラマーlv 3

3564 ワード

プログラマ質問リンク

問題の説明


ストリーミングサイトでは、最も多く再生された曲を2曲集め、ベストアルバムを発売します.曲は唯一の番号で区切られており、収録曲の基準は以下の通りである.
まずはたくさんの曲が流れているタイプを収录
まずはジャンル内で流れる曲を収録
タイプ内で同じ再生回数の曲には、まず固有番号の低い曲が収録される.
曲タイプを表す文字列配列タイプと、曲の再生回数を表す整数配列シナリオを指定する場合は、solution関数を完了し、最適なアルバムを入れる曲の一意の番号を順番に返します.
せいげんじょうけん
genres[i]はiという唯一のナンバーの曲です.
プレイ[i]は、iと番号付けされた唯一の曲の再生回数である.
genesはplaysと同じ長さで、1または10000未満です.
タイプは100種類未満です.
タイプの1曲であれば、1曲だけ選びます.
すべてのタイプで再生回数が異なります.

JAvaコード

import java.util.*;
 
class Solution {
    public int[] solution(String[] genres, int[] plays) {
        Map<String, Integer> map = new HashMap<>();
        
        //장르별로 순위를 매기기위해 누적 값을 더한다.
        for(int i = 0; i < genres.length; i++) {
            map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
        }
        
        //중복되지 않는 키값들을 genre에 저장.
        ArrayList<String> genre = new ArrayList<>();
        for(String key : map.keySet()) {
            genre.add(key);
        }
        
        //누적값에 따라서 내림차순으로 장르를 정렬한다.
        Collections.sort(genre, (o1, o2) -> map.get(o2) - map.get(o1)); 
        
        
        ArrayList<Integer> list = new ArrayList<>();
        for(int i = 0; i < genre.size(); i++) {
            String g = genre.get(i);
            
            //해당 장르의 음악 중에서 play횟수가 가장 큰 인덱스를 찾는다.
            int max = 0;
            int firstIdx = -1;
            for(int j = 0; j < genres.length; j++) {
                if(g.equals(genres[j]) && max < plays[j]) {
                    max = plays[j];
                    firstIdx = j;
                }
            }
            
            //해당 장르의 음악 중에서 play횟수가 두번째로 큰 인덱스를 찾는다.
            max = 0;
            int secondIdx = -1;
            for(int j = 0; j < genres.length; j++) {
                if(g.equals(genres[j]) && max < plays[j] && j != firstIdx) { 
                    max = plays[j];
                    secondIdx = j;
                }
            }
            
            list.add(firstIdx);
            if(secondIdx >= 0) list.add(secondIdx); 
            //secondIdx가 존재하면 리스트에 추가
        }
        
        int[] result = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
            result[i] = list.get(i);
        }
        return result;
    }
}

Pythonコード

def solution(genres, plays):
    answer = []

    dic1 = {}
    dic2 = {}

    for i, (g, p) in enumerate(zip(genres, plays)):
        if g not in dic1:
            dic1[g] = [(i, p)]
        else:
            dic1[g].append((i, p))

        if g not in dic2:
            dic2[g] = p
        else:
            dic2[g] += p

    for (k, v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True):
        for (i, p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]:
            answer.append(i)

    return answer