ベストアルバム|プログラマーlv 3
3564 ワード
プログラマ質問リンク
ストリーミングサイトでは、最も多く再生された曲を2曲集め、ベストアルバムを発売します.曲は唯一の番号で区切られており、収録曲の基準は以下の通りである.
まずはたくさんの曲が流れているタイプを収录
まずはジャンル内で流れる曲を収録
タイプ内で同じ再生回数の曲には、まず固有番号の低い曲が収録される.
曲タイプを表す文字列配列タイプと、曲の再生回数を表す整数配列シナリオを指定する場合は、solution関数を完了し、最適なアルバムを入れる曲の一意の番号を順番に返します.
せいげんじょうけん
genres[i]はiという唯一のナンバーの曲です.
プレイ[i]は、iと番号付けされた唯一の曲の再生回数である.
genesはplaysと同じ長さで、1または10000未満です.
タイプは100種類未満です.
タイプの1曲であれば、1曲だけ選びます.
すべてのタイプで再生回数が異なります.
問題の説明
ストリーミングサイトでは、最も多く再生された曲を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
Reference
この問題について(ベストアルバム|プログラマーlv 3), 我々は、より多くの情報をここで見つけました https://velog.io/@yoongyum/베스트앨범-프로그래머스-lv3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol