์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ถ๋ถ ์งํฉ(๋ฉฑ์งํฉ) ๊ตฌํ๊ธฐ
๐ ๋ฉฑ์งํฉ PowerSet?
๊ตฌํ ์ ์๋ ๋ชจ๋ ๋ถ๋ถ ์งํฉ์ ์งํฉ === ๋ฉฑ์งํฉ
"๋ชจ๋ ๋ถ๋ถ์งํฉ ๋ชจ์"์ด๋ผ๊ณ ์ฝ๊ฒ ์๊ฐํ์.
์๋ฅผ ๋ค์ด, [1, 2, 3, 4, 5]์ ๊ฐ์ ๋ฐฐ์ด์ ๋ฉฑ์งํฉ์ ๊ตฌํ๋ค๊ณ ํ๋ค๋ฉด,
๋ง ๊ทธ๋๋ก "๋ถ๋ถ" ์งํฉ์ด๋๊น ๊ฐ ์์๋ค์ "์๋ค"vs"์๋ค" ๋ผ๋ 2๊ฐ์ง ์ํ๋ฅผ ์ง๋ ์ ์๋ค.
1์ด ์์ด๋ ๋ถ๋ถ์งํฉ, ์์ด๋ ๋ถ๋ถ์งํฉ์ด๋ค. (๋ฏฟ๊ธฐ์ง ์๊ฒ ์ง๋ง ๋น ๋ฐฐ์ด๋ ๋ถ๋ถ์งํฉ์ผ๋ก ์น๋ค !)
๊ทธ๋์ 2(๊ฐ์ง ์ํ)^5(์์ ๊ฐ์) 32๊ฐ์ ๋ถ๋ถ์งํฉ์ ๊ตฌํ ์ ์๋ค.
32๊ฐ์ ๋ถ๋ถ์งํฉ์ ๋ชจ๋ ๋ด์ ์งํฉ์ ๋ฉฑ์งํฉ์ด๋ผ๊ณ ํ ์ ์๋ค.
๐ Tree๋ก ๊ตฌํํ๊ธฐ
DFS์์ ํ์์ ์ด์ฉํด ๊ทธ๋ ค๋ณด๋ฉด, ์ผ์ ํ ํจํด์ ๋ณผ ์ ์๋ค.
์ผ์ชฝ ๋ ธ๋๋ฅผ ์ ํํ์ ๋ ์ค๋ฅธ์ชฝ ๋ ธ๋๋ ์ ํ๋์ง ์๋๋ค.
"์๋ค"์ "์๋ค" 2๊ฐ์ง ์ํ ์ค ํ๋๋ง ์ ํํ๋ ๊ฒ์ฒ๋ผ ์ ํํ๋ ๋ ธ๋๋ ์ค๋ณต ์ ํํ์ง ์๋๋ค.
์ด Tree๋ ๊ฐ์ DEPTH๊น์ด์ ์์นํ ๋ ธ๋์ ๊ฐ์ด ๋ชจ๋ ๋์ผํ๋ค.
๋๋ฌธ์ ํ์ชฝ ๋ฐฉํฅ์ ๋ ธ๋๋ง ์ ํํ๋ฉฐ ์์ ํ์์ ํ์ ๋ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค๊ฒ ๋๋ค.
๐ ์ฝ๋๋ก ๊ตฌํํ๊ธฐ
[1, 2, 3, 4, 5]์ ๋ถ๋ถ์งํฉ์ ๊ตฌํด๋ผ ! ๋ผ๋ ๋ฌธ์ ๊ฐ ์ฃผ์ด์ก์๋
0๊ฐ, 1๊ฐ, 2๊ฐ, 3๊ฐ, 4๊ฐ, 5๊ฐ ์ฆ ๊ฐ์๋ฅผ ๋๋ ์๊ฐํ๋ค.
์ด๋ค ์ซ์๊ฐ ์ฐ์๊ณ , ์ด๋ค ์ซ์๊ฐ ์ฐ์ด์ง ์์๋์ง (๋จธ๋ฆฌ์์ผ๋ก๋) ์๊ธฐ ๋๋ฌธ์ ๊ฐ์๋ก ๋๋ ํ๋ฐ๋ฐ ๊ตฌํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ปดํจํฐ๋ ํด๋น ์ซ์์ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์์ง ๋ชปํ๋ค.
๋ชจ๋ ์์๋ฅผ ํ์ผ๋ฉด์ ๊ฒ์ํ ์๋ ์์ด๋ ๊ธฐ์ตํ์ง๋ ๋ชปํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๋์ง, ์ฌ์ฉํ์ง ์์๋์ง ์ํ๋ฅผ ๋ฐ๋ก ๊ธฐ๋กํด์ค์ผํ๋ค.
์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ, ๋ ธ๋๋ฅผ ์ง๋๊ฐ๋ฉด์ ์ผ์ชฝ ๋ ธ๋์๋ง true ๊ฐ์ ์ฃผ๋ฉฐ depth๋ฅผ ๋ํด๊ฐ๋ค.
depth ๊ฐ์ด ๋ฐฐ์ด์ ๊ธธ์ด์ ๊ฐ์์ง๋ฉด, ์ฆ ๋ง์ง๋ง ๋ ธ๋์ ๋์ฐฉํ์ ๋ ์ง๋๊ฐ ํ์ ์ ์ฐธ๊ณ ํ์ฌ ๋ฐฐ์ด์ filtering ํด์ฃผ์๋ค.
ex. ์ง๋๊ฐ ๋ ธ๋ ํ์ : [false, true, false] --> ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์๊ณ , ๊ทธ ์ค ์ธ๋ฑ์ค1๊ฐ๋ง ์ผ์ชฝ ๋ ธ๋์ ์์นํ์๋ค๋ ๊ฑธ ์ ์ ์๋ค.
true๊ฐ ์์นํ ์ธ๋ฑ์ค์ ๊ฐ์ ์ธ๋ฑ์ค์ ์๋ ๋ฐฐ์ด๊ฐ์ ์๋ก์ด ๋ฐฐ์ด์ push ํด์ค๋ค. -> [ ..., [2] ]
const getSubSets = function(arr){
// subSet ํจ์๋ ์ ์ธ๋์์ ๋์ ํ๊ฒฝ (flag์subSets)์ ๊ณ์ ๊ธฐ์ตํ๊ฒ๋๋ค.
// ํด๋น ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ํ๋ ๋ฐฐ์ด
let flag = new Array(arr.length).fill(false);
// ๋ถ๋ถ ์งํฉ๋ค์ ๋ชจ์๋๋ ๋ฐฐ์ด
const subSets = [];
const subSet = function DFS(depth){
// BASE CASE
// ํธ๋ฆฌ์ ๋๋ถ๋ถ์ ๋ค๋ค๋์ ๋ ์ฌ๊ท ํจ์๋ฅผ ์ข
๋ฃํ๊ณ subSets๋ฐฐ์ด์ pushํ๋ค.
if(depth === arr.length){
const element = arr.filter((_,index) => flag[index]);
subSets.push(element);
return;
}
// ํธ๋ฆฌ์ ์ผ์ชฝ ํด๋น depth๋ true
flag[depth] = true;
subSet(depth + 1);
// ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ํด๋น depth๋ false
flag[depth] = false;
subSet(depth + 1);
}
// subSet ํจ์ ํธ์ถ : depth 0๋ถํฐ ์์ํ๋ค.
subSet(0);
// ์ฌ๊ท ํธ์ถ์ด ๋ชจ๋ ๋๋๊ณ ๋ถ๋ถ์งํฉ ์์๋ค์ด ๋ด๊ธด sunSets ๋ฐฐ์ด์ ๋ฆฌํดํ๋ค.
return subSets;
}
// ํจ์ ํธ์ถ
getSubSets([1, 2, 3, 4, 5]);
/* [
[1, 2, 3, 4, 5],
[1, 2, 3, 4],
[1, 2, 3, 5],
[1, 2, 3],
[1, 2, 4, 5],
[1, 2, 4],
[1, 2, 5],
[1, 2],
[1, 3, 4, 5],
[1, 3, 4],
[1, 3, 5],
[1, 3],
[1, 4, 5],
[1, 4],
[1, 5],
[1],
[2, 3, 4, 5],
[2, 3, 4],
[2, 3, 5],
[2, 3],
[2, 4, 5],
[2, 4],
[2, 5],
[2],
[3, 4, 5],
[3, 4],
[3, 5],
[3],
[4, 5],
[4],
[5],
[]
] */
ํธ๋ฆฌ๋ฅผ ์์ ํ์ํ ๊ฒฐ๊ณผ์ ๋~๊ฐ์ด ๋์ค๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
const subSets = (arr) => {
const result = [];
const dfs = (start = 0, subset = []) => {
result.push(subset);
for(let i=start; i<arr.length; i++){
dfs(i + 1, [...subset, arr[i]];
}
};
dfs();
return result;
};
์ค๋ ํด์ผํ ์ผ --> Udemy DFS ์์ ํ์ ๊ฐ์ ๋ฃ๊ธฐ