๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
the others/Algorithm

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“  ๋ถ€๋ถ„ ์ง‘ํ•ฉ(๋ฉฑ์ง‘ํ•ฉ) ๊ตฌํ•˜๊ธฐ

by ciocio 2021. 9. 7.

๐Ÿ“Œ  ๋ฉฑ์ง‘ํ•ฉ 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 ์™„์ „ ํƒ์ƒ‰ ๊ฐ•์˜ ๋“ฃ๊ธฐ

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€