[DAY-4] JS ์ฃผ์ ๋ฌธ๋ฒ(4)
๐ ํท๊ฐ๋ ธ๋ & ๋ชฐ๋๋ ๋ถ๋ถ๋ค๋ง ์ ๋ฆฌํ๋ ๋๋ง์ TIL
๐ฏ ๋ชจ๋ ๊ฐ์ ๋ด์ฉ์ ์ ์ง ์์์!
์ค๋์ ์๊ฐ์?
๋๋ฒ์งธ ์ค์ต ์ฝ๋๋ฅผ ์ง๋ค๊ฐ ๋จธ๋ฆฌ๊ฐ ํฐ์ง๋ปํ๋ค.
๊ทธ๋ฆฌ๊ณ ํด์ ๊ฐ์๋ฅผ ํ์ธํ๊ณ ๋ ๋๋๋ค.
์ด๋ป๊ฒ 3๋ฌธ์ฅ๋ง์ผ๋ก solutionํจ์๋ฅผ ์งค ์ ์์๊น?
JS ๋ด์ฅ ํจ์๋ฅผ ์ฌ๋ฟ ์ด์ฉํ๊ธฐ ์ํด์ JS์ ๋ํ ๊น์ ์ดํด๊ฐ ์ฐ์ ์์ด์ผ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๋ค.
๊ณต๋ถ ์ด์ฌํ ํด์ผ๊ฒ ๋ค..
[1] ํ(Queue)
FIFO ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
Linear Queue์ Circular Queue์ ๋ ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
Queue๋ ๋ฐฐ์ด๋ก ํํํ ์ ์์ง๋ง, ๋นํจ์จ์ ์ ๋๋ค.
๋ฐ๋ผ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ ๊ฒ์ด ์ ์ ํฉ๋๋ค. (shift ์ฌ์ฉ ๊ธ์ง)
[+] ์ค์ต ์ฝ๋ 1
๐ queue class๋ฅผ ๊ตฌํํด์ผ ํ๋๋ฐ ๋ฐฐ์ด ์ด์ฉํด์ ๋ง๋๋ก ํ์ด๋ฒ๋ ธ๋คโฆ
ํ์ด์ฌ queue ๊ตฌํ ๋ฐฉ๋ฒ์ JS๋ก ๊ทธ๋๋ก ์ฎ๊ฒจ๋์ ๋ฏํ ์ฝ๋ ์์ฑ
function pop_val(queue) {
let len = queue.length;
let val = queue[0];
for (let i = 0; i < len - 1; i += 1) {
queue[i] = queue[i + 1];
}
queue.splice(len - 1, len);
return val;
}
function solution(priorities, location) {
let answer = 0;
let queue = [];
let count = 0;
let val_arr = Array.from(Array(priorities.length), function (v, k) {
return k + 1;
});
want_val = val_arr[location];
for (let i = 0; i < priorities.length; i += 1) {
queue.push([val_arr[i], priorities[i]]);
}
while (true) {
let print = true;
val = pop_val(queue);
for (let i = 0; i < queue.length; i += 1) {
if (val[1] < queue[i][1]) {
queue.push(val);
print = false;
break;
}
}
if (print == true) {
count += 1;
if (val[0] == want_val) {
return count;
break;
}
}
}
return answer;
}
[2] ํด์ ํ ์ด๋ธ(Hash Table)
ํค์ ๊ฐ์ ๋ฐ์ ํค๋ฅผ ํด์ฑ(Hashing)ํ์ฌ ๋์จ index์ ๊ฐ์ ์ ์ฅํ๋ ์ ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
์ฝ์ ์ O(1)์ด๋ฉฐ, ํค๋ฅผ ์๊ณ ์๋ค๋ฉด ์ญ์ , ํ์๋ O(1)๋ก ์ํํฉ๋๋ค.
๋ฐ๋ผ์ ํค ๊ฐ์ ์๊ณ ์์ ๊ฒฝ์ฐ์, ๋น ๋ฅด๊ฒ ๊ทธ ๊ฐ์ ์ฐพ์์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํฉ๋๋ค.
ํด์ ํ ์ด๋ธ์์ ํด์ ํจ์์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ์ฌ ๊ฒน์น๋ค๋ฉด ํด์ ์ถฉ๋์ด ์ผ์ด๋ ์ ์์ต๋๋ค.
ํด์ ํจ์
์ ๋ ฅ๋ฐ์ ๊ฐ์ ํน์ ๋ฐค์ ๋ด ์ซ์๋ก ๋ณ๊ฒฝํ๋ ํจ์์ ๋๋ค.
[2-1] ํด์ ์ถฉ๋ ํด๊ฒฐ๋ฒ
- ์ ํ ํ์ฌ๋ฒ
์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์์ผ๋ก ํ ์นธ ์ด๋ํฉ๋๋ค. (์ธ๋ฑ์ค๋ฅผ ํ ์นธ ์์ผ๋ก ์ฎ๊น๋๋ค.)
์ต์ ์ ๊ฒฝ์ฐ์ ํ์์ O(n)์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. - ์ ๊ณฑ ํ์ฌ๋ฒ
์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ํ์์ ์ ๊ณฑ๋งํผ ์์ผ๋ก ์ด๋ํฉ๋๋ค. - ์ด์ค ํด์ฑ
์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ค๋ฅธ ํด์ ํจ์๋ฅผ ์ด์ฉํฉ๋๋ค. - ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ
๋ฒํท์ ๊ฐ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ฌ์ฉํ์ฌ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋ฆฌ์คํธ์ ๊ฐ์ ์ถ๊ฐํฉ๋๋ค.
์ต์ ์ ๊ฒฝ์ฐ, ํ๋์ ๋ฒํท์ด ๋ฌดํ์ ๋์ด๋ ์ ์์ต๋๋ค.
[2-2] JS ๊ตฌํ ๋ฐฉ๋ฒ
- ๋ฐฐ์ด ๊ตฌํ
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ์ด๋ผ ํ ์ ์์ต๋๋ค.
const table = [];
table["key"] = "value";
console.log(table["key"]); // value
delete table["key"];
- ๊ฐ์ฒด ๊ตฌํ
์ ์ผ ๊ฐ๋จํ๊ณ ์ ์์ ์ธ ๋ฐฉ๋ฒ์ด๋ฉฐ, ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
const table = {};
table["key"] = "value";
console.log(table["key"]); // value
delete table["key"];
- Map ๊ตฌํ
set ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ฃ๊ณ , getํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ฐพ์ ์ ์์ต๋๋ค.
ํธํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฉฐ ์ํ๋ฅผ ํธํ๊ฒ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
const table = new Map();
table.set("key", "value");
console.log(table.get("key")); // value
console.log(talbe.keys()); // {'key'}
console.log(table.values()); // {'value'}
table.delete("key"); // ํ๋์ ์์๋ง ์ญ์
table.clear(); // ์ ์ฒด ์์ ์ญ์
- Set ๊ตฌํ
set์ ํค์ ๊ฐ์ด ๋์ผํ๊ฒ ์ ์ฅ๋๋ ๋ฐฉ์์ ๋๋ค.
์ค๋ณต๋ ๋ด์ฉ์ ์ ๋ถ ์ ๊ฑฐํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const table = new Set();
table.add("key"); // Key์ value๊ฐ ๋์ผํ๊ฒ ๋ค์ด๊ฐ๋๋ค.
console.log(table.has("Key")); // true
console.log(talbe.size); // 1
table.clear();
console.log(table.size); // 0
[+] ์ค์ต ์ฝ๋ 2
๐ ์ด๋ป๊ฒ ..์ด๋ฐ ์ฝ๋๊ฐ ๋์ค์ฃ ?
์ฐ์ ํด๋น ๋ฌธ์ ์ ์๊ตฌ์ฌํญ์ 4๊ฐ์ง์ด๋ค.
- ๊ฐ์ ์ฅ๋ฅด๋ผ๋ฆฌ ๋ฌถ๋๋ค
- ๋ฌถ์ ๋ ธ๋๋ค์ ์ฌ์ ์์ผ๋ก ์ ๋ ฌํ๋ค
- ์ฅ๋ฅด๋ณ ๋ ธ๋๋ฅผ 2๊ฐ๊น์ง๋ง ์๋ฅธ๋ค
- ๊ณ ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค.
ํ๋ค๊ฐ ์ํ๋ ค์ ๊ฑฐ์ ์ธ๋ค์ํผ ์ ๋ต ์ฝ๋๋ฅผ ๋ดค์ต๋๋ค.
- ์ ๋ต ์ฝ๋
function solution(genres, plays) {
// ํด์ฌ ํ
์ด๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํด Map ์ ์ธ
const genresMap = new Map();
genres
// --------------map
// ๊ฐ๊ณผ ์ธ๋ฑ์ค๋ฅผ ์ธ์๋ก ๋ฐ์ ์๋์ผ๋ก for๋ฌธ์ ๋๋ ค ๊ฐ์ ๋นผ์ค๋ค.
// ๋ฐ๋ผ์ ์๋์ ๋ฌธ์ฅ์ genre(๊ฐ)๊ณผ index๋ฅผ ๋นผ [๊ฐ, plays[์ธ๋ฑ์ค]]์ ํํ๋ก ๋ฐํํ๋ค.
.map((genre, index) => [genre, plays[index]])
// --------------forEach
// forEach : ๋ฐํ๋ ๋ฐฐ์ด ์์ ๊ฐ๊ฐ์ ๋ํด ์ฃผ์ด์ง ํจ์๋ฅผ ์คํํ๋ค.
// `[์ฅ๋ฅด ๊ฐ, ์ธ๋ฑ์ค์ ๋ง๋ play๊ฐ], ์ฒ๋ฆฌํ ํ์ฌ ์์์ ์ธ๋ฑ์ค`๋ฅผ ์ธ์๋ก ๋ฃ์ด ํจ์ ์คํ
.forEach(([genre, play], index) => {
// --------------const data ์ ์ธ
// ์์ฑํ genresMap์ key๊ฐ์ผ๋ก genre๊ฐ ์์ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ data์ ์ ์ฅ
// ์์ ๊ฒฝ์ฐ (||) {total : 0, songs : []} ์ผ๋ก ํด๋น genre์ ๋ํ ๊ฐ ์ด๊ธฐํ
const data = genresMap.get(genre) || { total: 0, songs: [] };
// --------------set
// Map์์ ๊ฐ์ ๋ฃ์ ๋ ์ฌ์ฉํ๋ ํจ์
// Map์ key๋ก genre๋ฅผ ์ฌ์ฉํ๋ฉฐ ํ์ ๋์ค๋ {} ์์ value
genresMap.set(genre, {
// value๋ {total : (์์), songs : [...]}์ ๊ฐ์ฒด ํํ
total: data.total + play,
// --------------songs์ ๋ด๋ถ ๊ฐ
// ...๋ data(genresMap์ genre ํค ๊ฐ์ ๋ํ value)๋ฅผ ์ ๋ถ ๋ถ๋ฌ์จ๋ค.
// ๊ธฐ์กด์ ๊ธฐ๋ก๋์ด ์๋ ๊ฐ({total : ~, index : ~})๋ค์ ๋ชจ๋ ๋ถ๋ฌ์ ๋ค์ ๊ฐ์ ๋ง๋ถํ๋ค.
songs: [...data.songs, { play, index }]
// --------------sort
// play ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆฝ์ฐจ์ ์ ๋ ฌ
.sort((a, b) => b.play - a.play)
// --------------slice
// ์์ ์ธ๋ฑ์ค 0๋ถํฐ ๋ ์ธ๋ฑ์ค 2 ์ ๊น์ง์ ๊ฐ๋ง ํฌํจํ์ฌ ์๋ฅธ๋ค. (0, 1)
.slice(0, 2),
});
});
// --------------entries()
// ...genresMap(genresMap ์์ ์๋ ์์๋ค ์ ๋ถ)๋ฅผ ํค์ ๊ฐ ์์ผ๋ก ๋ฐฐ์ด๋ก ๋ฐํํด์ค๋ค.
return (
[...genresMap.entries()]
// --------------sort
// total์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
.sort((a, b) => b[1].total - a[1].total)
// --------------flatMap
// flat() : ํ๋ซ ํจ์๋ ์ค์ฒฉ๋ ๋ฐฐ์ด ๊ตฌ์กฐ๋ฅผ ์ ํด์ง ๊น์ด๋งํผ ํํํ๊ฒ ๋ง๋ค ์ ์๋ค. (default : 1)
// flatMap()์ ๋ฐฐ์ด์ ํํํํ๋ flat๊ธฐ๋ฅ์ ๊ฐ ์์์ ์ ๊ทผํ์ฌ ์ฌ์ฉ์ ์ ์ ๋ก์ง์ ์ํํ ์ ์๊ฒ ํด์ค๋ค.
.flatMap((i) => i[1].songs)
// --------------map
// song์ ์ธ์๋ก ๋ฐ์ ์๋์ผ๋ก for๋ฌธ์ ๋์ ์ํ๋ ์์๋ฅผ ๋ฐํํ๋ค (song.index ๋ฐํ)
.map((song) => song.index)
);
}
console.log(
solution(
["classic", "pop", "classic", "classic", "pop"],
[500, 600, 150, 800, 2500]
)
);
๐ Wow..
3๋ฌธ์ฅ์ผ๋ก ์๋ฃจ์ ํจ์๋ฅผ ์์ฑํ ์ ์๋ค๋ ๋ ์์ง ๋ฉ์๋ค.
map, forEach, flat, flatMap ๋ฑ์ ์ฌ๋ฌ ํจ์ ๋์ ์ฌ์ฉ์ ์ฐจ์ฐจ ์ตํ๋๊ฐ์ผ๊ฒ ๋ค.
[3] ๊ทธ๋ํ
๊ทธ๋ํ๋ ์ ์ ๊ณผ ์ ์ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๋น์ ํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค.
์ ์ ์งํฉ๊ณผ ๊ฐ์ ์งํฉ์ผ๋ก ํํํ ์ ์์ต๋๋ค.
[3-1] ๊ทธ๋ํ ํน์ง
- ์ ์ ์ ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ์ ๊ฐ์ง ์ ์์ต๋๋ค.
- ํฌ๊ฒ ๋ฐฉํฅ ๊ทธ๋ํ์ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์์ต๋๋ค.
- ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ์ฌ์ดํด์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ฌ์ดํด
์ฌ์ดํด์ด๋ ๊ทธ๋ํ์ ์ ์ ๊ณผ ๊ฐ์ ์ ๋ถ๋ถ ์งํฉ์์ ์ํ์ด ๋๋ ๋ถ๋ถ์ ๋งํฉ๋๋ค.
[3-2] ๊ทธ๋ํ์ ์ข ๋ฅ
(1) ๊ฐ์ ์ ๋ฐฉํฅ์ฑ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
- ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ
๊ฐ์ ์ผ๋ก ์ด์ด์ง ์ ์ ๋ผ๋ฆฌ ์๋ฐฉํฅ์ผ๋ก ์ด๋์ด ๊ฐ๋ฅํ ๊ทธ๋ํ์
๋๋ค. (๋ฐฉํฅ์ด ์์ต๋๋ค.)
๋ฐ๋ผ์ (A, B)์ (B, A)๋ ๊ฐ์ ๊ฐ์ ์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
- ๋ฐฉํฅ ๊ทธ๋ํ
๊ฐ์ ์ ๋ฐฉํฅ์ฑ์ด ์กด์ฌํ๋ ๊ทธ๋ํ์ด๋ฉฐ <A, B>์ <B, A>๋ ๋ค๋ฅธ ๊ฐ์ ์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
(2) ๊ฐ์ ์ ์ฐ๊ฒฐ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
- ์ฐ๊ฒฐ ๊ทธ๋ํ
๋ชจ๋ ์ ์ ์ด ์๋ก ์ด๋ ๊ฐ๋ฅํ ์ํ์ธ ๊ทธ๋ํ์ ๋๋ค.
- ๋น์ฐ๊ฒฐ ๊ทธ๋ํ
ํน์ ์ ์ ์ ์ฌ์ด์ ๊ฐ์ ์ด ์กด์ฌํ์ง ์๋ ๊ทธ๋ํ์ ๋๋ค.
- ์์ ๊ทธ๋ํ
๋ชจ๋ ์ ์ ๋ผ๋ฆฌ ์ฐ๊ฒฐ๋ ์ํ์ธ ๊ทธ๋ํ์
๋๋ค.
๋ฐ๋ผ์ ํ ์ ์ ์ ๊ฐ์ ์๋ โ๋ชจ๋ ์ ์ ์ ์ -1
โ์ด ๋ฉ๋๋ค.
๋ํ ๋ชจ๋ ๊ฐ์ ์ ์๋ โ(๋ชจ๋ ์ ์ ์ ์ -1) * ์ ์ ์ ์
โ๊ฐ ๋๊ฒ ์ฃ .
[3-3] ๊ตฌํ ๋ฐฉ๋ฒ
์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ทธ๋ํ๋ฅผ ํํํ ์ ์์ต๋๋ค.
- ์ธ์ ํ๋ ฌ
์ ์ ์ ํฌ๊ธฐ ๋งํผ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์ฐ๊ฒฐ์ด ์๋ ์ํ๋ก ์ด๊ธฐํํฉ๋๋ค. ์ด๋ ์ฐ๊ฒฐ์ด ๋ ๋ถ๋ถ๋ง ํ์ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
const graph = Array.from(Array(5), () => Array(5).fill(false));
// ๊ฐ์
graph[0][1] = true; // 0-> 1
graph[1][3] = true; // 1-> 3
// ๊ฐ์ค์น๊ฐ ์์ ๊ฒฝ์ฐ์๋ ์ด๊ธฐ๊ฐ์ null๋ก, ๊ฐ์ ์ ๊ฐ์ ๊ฐ์ค์น๋ก ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
- ์ธ์ ๋ฆฌ์คํธ
const graph = Array.from(Array(5), () => []);
graph[0].push(1); // 0-> 1
graph[1].push(3); // 1-> 3
๋๊ธ๋จ๊ธฐ๊ธฐ