[プログラマー]ベストアルバムJavascript
42856 ワード
質問の表示
タイプソート タイプをキーとし、歌曲配列を値とするハッシュ値 を生成する.のジャンル順に従って、そのジャンルの曲配列において大きな値を求め、シナリオにおいて を配列する.
成功!
問題の条件をよく読んで意味を理解する
dicでは、再生回数を累積してタイプを決定する順序とする. タイプ、再生回数、インデックスを1つのオブジェクトとします. ジャンルの順で、1曲の再生回数、インデックスを基準に多重分類を行う. dupdicでは,ジャンルの曲数が2以上であれば,以降の曲は除外する. countオブジェクトでは、曲のインデックスと再生回数の配列に従って塗りつぶされます. タイプをキーとし、再生回数を値とするaccオブジェクトを生成します. accでは、再生回数を基準に降順に並び、ジャンルごとに該当する曲のリストを選択し、降順に並べて2曲を選択する.
🔒 質問する
🔐 ソリューション
indexof()
を見つけ、結果としてpush 🔓 プール(2 h)
初めての試み
function solution(genres, plays) {
// 장르 순서 정하기
let sorted_plays = plays.slice();
sorted_plays.sort((a,b) => a-b);
let order = [];
while(sorted_plays.length){
let idx = plays.indexOf(sorted_plays.pop());
if(!order.includes(genres[idx]))
order.push(genres[idx]);
}
// 장르를 키, 노래 배열을 값으로 가지는 객체 생성
let lists = new Map();
for(let i=0; i<plays.length; i++){
if(!lists.has(genres[i])){
lists.set(genres[i], [plays[i]]);
} else {
let pre = lists.get(genres[i]);
pre.push(plays[i]);
lists.set(genres[i], pre);
}
}
// 장르 중 최대 재생횟수를 가진 두 노래의 인덱스 찾기
let result = [];
order.forEach(x => {
let musics = lists.get(x).sort((a,b) => b-a);
let top2 = musics.splice(0,2);
result.push(...top2.map(x => plays.indexOf(x)));
})
return result
}
/*
채점결과 : 20.0 / 100.0
*/
最も多く再生される2曲のインデックスを探していると,再生回数が一致すればインデックスを取得できることに気づいた.💦二次試行
function solution(genres, plays) {
let sorted_plays = plays.slice();
sorted_plays.sort((a,b) => a-b);
let order = [];
while(sorted_plays.length){
let idx = plays.indexOf(sorted_plays.pop());
if(!order.includes(genres[idx]))
order.push(genres[idx]);
}
let lists = new Map();
for(let i=0; i<plays.length; i++){
if(!lists.has(genres[i])){
lists.set(genres[i], [plays[i]]);
} else {
let pre = lists.get(genres[i]);
pre.push(plays[i]);
lists.set(genres[i], pre);
}
}
// 장르와 재생횟수를 고려하면서, 결과 배열에 포함되어 있는지 확인
let result = [];
order.forEach(x => {
let musics = lists.get(x).sort((a,b) => b-a);
let top2 = musics.splice(0,2);
top2.forEach(t => {
for(let i=0; i<plays.length; i++){
if(genres[i] === x && plays[i] === t && !result.includes(i)){
result.push(i);
break;
}
}
})
})
return result;
}
/*
채점결과 : 33.3 / 100.0
*/
ほほほ、ここまで来て、私は問題を理解していないと思って、だから私はまたよく読んで、歌を収録する基準が1番ではないことを発見して、🥲3回目の試み
function solution(genres, plays) {
// 장르의 순서를 누적 횟수 기준으로 변경
let order = new Map();
let lists = new Map();
for(let i=0; i<plays.length; i++){
if(!lists.has(genres[i])){
lists.set(genres[i], [plays[i]]);
order.set(genres[i], plays[i]);
} else {
let pre = lists.get(genres[i]);
pre.push(plays[i]);
lists.set(genres[i], pre);
order.set(genres[i], order.get(genres[i]) + plays[i]);
}
}
// 재생횟수를 내림차순으로 정렬한 뒤 장르만 추출
let tmp = [...order.entries()].sort((a,b) => b[1]-a[1]);
order = tmp.map(x => x[0]);
let result = [];
order.forEach(x => {
let musics = lists.get(x).sort((a,b) => b-a);
let top2 = musics.splice(0,2);
top2.forEach(t => {
for(let i=0; i<plays.length; i++){
if(genres[i] === x && plays[i] === t && !result.includes(i)){
result.push(i);
break;
}
}
})
})
return result;
}
成功!
🔁 feedback
問題の条件をよく読んで意味を理解する
+他人の回答
function solution(genres, plays) {
var dic = {};
genres.forEach((t,i)=> {
dic[t] = dic[t] ? dic[t] + plays[i] :plays[i];
});
var dupDic = {};
return genres
.map((t,i)=> ({genre : t, count:plays[i] , index:i}))
.sort((a,b)=>{
if(a.genre !== b.genre) return dic[b.genre] - dic[a.genre];
if(a.count !== b.count) return b.count - a.count;
return a.index - b.index;
})
.filter(t=> {
if(dupDic[t.genre] >= 2) return false;
dupDic[t.genre] = dupDic[t.genre] ? dupDic[t.genre]+ 1 : 1;
return true;
})
.map(t=> t.index);
}
function solution(genres, plays) {
const count = {};
let answer = [];
const acc = genres.reduce((a, c, i) => {
debugger;
count[c] ? count[c].push([i, plays[i]]) : count[c] = [[i, plays[i]]];
return a.set(c, a.get(c) ? a.get(c) + plays[i] : plays[i]), a;
}, new Map());
[...acc].sort((a, b) => b[1] - a[1]).map(v => {
answer = answer.concat(count[v[0]].sort((c, d)=>d[1]-c[1]).slice(0,2));
});
return answer.map(v=>v[0]);
}
Reference
この問題について([プログラマー]ベストアルバムJavascript), 我々は、より多くの情報をここで見つけました https://velog.io/@mauv2sky/프로그래머스-베스트앨범-Javascriptテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol