๋ฌธ์ : https://school.programmers.co.kr/learn/courses/30/lessons/42579
์นดํ ๊ณ ๋ฆฌ: ํด์
์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ ํ ์คํธ ๊ณ ๋์ Kit, https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit
๊ฐ ์ฅ๋ฅด๋ณ ์ด ์ฌ์ ์๋ฅผ ์ ์ฅํ๋ ํด์ ํ ์ด๋ธ์ ๋ง๋ ๋ค.
genreTotalPlay : { classic: 1450, pop: 3100}
๊ฐ ์ฅ๋ฅด์ ์ํ ๋ ธ๋์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๋ ํด์ ํ ์ด๋ธ์ ๋ง๋ ๋ค.
genreTable : {classic: [ [500, 0], [150, 2], [800, 3] ], pop: [ ~]}
2์์ ๋ง๋ ํด์ ํ ์ด๋ธ์ ์ํ ๊ฐ ์ฅ๋ฅด์ ๋ ธ๋๋ค์ ์ฌ์์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ , ์ต๋ 2๊ฐ๋ง ์ ํํ๋ค.
genreTable : {classic: [ [ 800, 3 ], [ 500, 0 ] ], pop: [ [ 2500, 4 ], [ 600, 1 ] ]}
์ด ์ฌ์ ์๊ฐ ๋์ ์ฅ๋ฅด ์์ผ๋ก ์ฅ๋ฅด ์ด๋ฆ ์ ๋ ฌํด์ ์๋ก์ด ๋ฐฐ์ด ์์ฑํ๋ค.
keyArr : ["pop", "classic"]
keyArr์ ๊ฐ ์ฅ๋ฅด ์ด๋ฆ์ key๋ก ๊ฐ์ง๋ genreTable์ value ์ค index๋ง ์ด์ด๋ถ์ธ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ๋ค.
answer : [4,1,3,0]
function solution(genres, plays) {
// ๊ฐ ์ฅ๋ฅด๋ณ ์ด ์ฌ์ ์๋ฅผ ์ ์ฅํ๋ ํด์ ํ
์ด๋ธ genreTotalPlay : { classic: 1450, pop: 3100}
const genreTotalPlay = new Map();
genres.forEach((genre, index) => {
if (genreTotalPlay.get(genre)) {
// table์ ์ฅ๋ฅด๊ฐ ๋ฑ๋ก๋์ด์๋ค๋ฉด
const sum = genreTotalPlay.get(genre);
genreTotalPlay.set(genre, sum + plays[index]);
} else {
genreTotalPlay.set(genre, plays[index]);
}
});
// ๊ฐ ์ฅ๋ฅด์ ์ํ ๋
ธ๋์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํ๋ ํด์ ํ
์ด๋ธ gerneTable : {classic: [ [500, 0], [150, 2], [800, 3] ], pop: []}
const genreTable = new Map();
genres.forEach((gerne, index) => {
if (genreTable.get(gerne)) {
genreTable.set(gerne, [...genreTable.get(gerne), [plays[index], index]]);
} else {
genreTable.set(gerne, [[plays[index], index]]); // [500, 0] ์ด๋ ๊ฒ ์ฌ์์์ index๋ฅผ ํจ๊ป ์ ์ฅ
}
});
// ๊ฐ ์ฅ๋ฅด์ ์ํ ๋
ธ๋๋ค์ ์ฌ์์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ , ์ต๋ 2๊ฐ๋ง ์ ํํ๊ธฐ
// 'classic' => [ [ 800, 3 ], [ 500, 0 ] ],
// 'pop' => [ [ 2500, 4 ], [ 600, 1 ] ]
genreTable.forEach((arr, key) => {
const newArr = arr.sort((a, b) => {
return b[0] - a[0];
});
if (newArr.length <= 2) {
genreTable.set(key, newArr);
} else {
genreTable.set(key, newArr.slice(0, 2));
}
});
// ์ด ์ฌ์ ์๊ฐ ๋์ ์ฅ๋ฅด ์์ผ๋ก ์ฅ๋ฅด ์ด๋ฆ ์ ๋ ฌ
const keyArr = [...genreTotalPlay.keys()].sort((a, b) => {
return genreTotalPlay.get(b) - genreTotalPlay.get(a);
});
// ์ ๋ ฌ๋ ์ฅ๋ฅด ์ด๋ฆ์ ํด๋นํ๋ ๋
ธ๋๋ค์ ์ธ๋ฑ์ค ์ด์ด ๋ถ์ด๊ธฐ
let answer = [];
keyArr.forEach((key) => {
genreTable.get(key).forEach((element) => answer.push(element[1]));
});
return answer;
}
solution(
["classic", "pop", "classic", "classic", "pop"],
[500, 600, 150, 800, 2500]
);
ํ๊ธด ํ์ง๋ง, ๋ด ์ฝ๋์๋ ๋ญ๊ฐ ๋ถํ์ํ ๋ก์ง์ด ์์ด ๋จผ ๊ธธ์ ๋์ ํผ ๊ฒ ๊ฐ์๊ณ , ๋ ์ฝ๊ณ ๊ฐ๊ฒฐํ๊ฒ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ ๊ฐ์๋ค.
๋ค์์ solution ์ฝ๋์ด๋ค.
function solution(genres, plays) {
const genreMap = new Map();
genres
.map((genre, index) => {
return [genre, plays[index]];
}) // [classic, 500], [pop, 600] ...
.forEach(([genre, play], index) => {
// [classic, 500, 0] ๋น ๊ตฌ์กฐํ ํ ๋น
// ๊ธฐ์กด ์ฅ๋ฅด์ด๋ฆ์ ํด๋นํ๋ ๋ฐ์ดํฐ
const data = genreMap.get(genre) || { total: 0, songs: [] }; // ์ฅ๋ฅด๊ฐ ์ฒ์ ๋ฑ๋ก๋ ๋๋ undefined๊ฐ ๋์ฌ ๊ฒ์ด๋ฏ๋ก, ์ด๊ฒ ์ฒ๋ฆฌ
genreMap.set(genre, {
total: data.total + play,
songs: [...data.songs, { play, index }] // ๊ธฐ์กด์ songs๊ฐ [{500, 0}, {150,2} ...] ์ด๋ ๊ฒ ์์ ๊ฒ์ด๊ณ , ์ฌ๊ธฐ๋ค๊ฐ ํ์ฌ์ {play, index}๋ฅผ ์ถ๊ฐํด์ค ๊ฒ
.sort((a, b) => b.play - a.play) // ์ฌ์ ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด์ 2๊ฐ๋ง ์งค๋ผ์ ์ ์ฅ
.slice(0, 2),
});
// genremap : {
// classic: { total: 1450 , songs: [{ play: 800, index: 3 }, { play: 500, index: 0 } ] },
// pop : { total: 3100, songs: [{ play: 2500, index: 4 }, { play: 600, index: 1 } ] }
// }
//
});
return [...genreMap.entries()] // [ [ 'classic', { total: 1450, songs: [Array] } ], [ 'pop', { total: 3100, songs: [Array] } ] ]
.sort((a, b) => b[1].total - a[1].total)
.flatMap((item) => item[1].songs) // [ { play: 2500, index: 4 }, { play: 600, index: 1 }, { play: 800, index: 3 }, { play: 500, index: 0 } ]
.map((song) => song.index);
}
์ฒ์ ์ฃผ์ด์ง genres
๋ฐฐ์ด๊ณผ plays
๋ฅผ ์กฐํฉํด, ๊ฐ ์ฅ๋ฅด๋ณ ์ด ์ฌ์ ์total
๊ณผ ๋
ธ๋ ๋ชฉ๋ก songs
๋ฅผ ํฌํจํ ํด์ํ
์ด๋ธ์ ๋ง๋ค์ด ๋๊ณ ๊ณ์ฐํ๋ ๊ฒ์ด ํจ์จ์ ์ผ๋ก ๋๊ปด์ก๋ค. ์ด๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ ์ต๋ ์ฌ์ ๋ ๋
ธ๋ 2๊ฐ๋ง ์ ํํ๋ ๊ณผ์ ๋ ํฌํจ๋๋ค.
genremap : {
classic: { total: 1450 , songs: [{ play: 800, index: 3 }, { play: 500, index: 0 } ] },
pop : { total: 3100, songs: [{ play: 2500, index: 4 }, { play: 600, index: 1 } ] }
}
๋
ผ๋ฆฌ์ฐ์ฐ์ ||
(or)์ ์ด์ฉํด data์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํด์ฃผ๋ ๊ธฐ๋ฒ๋ ์ ์์๋์ผ๊ฒ ๋ค.
const data = genreMap.get(genre) || { total: 0, songs: [] };
flatMap()
ํจ์๋ฅผ ์ด์ฉํด ๊ฐ ์์๋ค์ ๊น์ด๋ฅผ -1์ฉ ํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์ด์ค ์ ์๋ค.