DFS 부분집합 구하기

김용희·2022년 3월 21일
0
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(n) {
        // 경우의수 2^n
        let answer = [];
        let ch = Array.from({ length: n + 1 }, () => 0);
        // 방문 체크배열 n번까지 인덱스생겨야하기때문에 n+1 길이, 0으로 초기화
        function DFS(L) {
          //자기를 포함한 외부함수의 지역변수 접근가능
          if (L === n + 1) {
            //L이 4면 탈출
            let tmp = "";
            for (let i = 1; i <= n; i++) {
              if (ch[i] === 1) tmp += i + " ";
              //방문한곳이면 tmp에 저자
            }
            // console.log(tmp);
            if (tmp.length > 0) answer.push(tmp.trim());
            //마지막공백 trim으로 자름 , 공집합 포함안되게하려고 length>0으로 없앰
          } else {
            // 트리계층을 파고들어감
            // 왼쪽자식노드로 갈땐 방문 했을때, 오른쪽자식노드로 갈떈 방문 안했을 경우
            // 체크한거랑 체크안한거 구분
            // 이때 트리계층 DFS[숫자] 높이는데 숫자가 if에 만족하면 for문으로 체크된 배열 출력

            ch[L] = 1;
            //dfs처음 소환한 인자값 위치 포함 할떄 체크1
            DFS(L + 1);
            //왼쪽 자식노드로 보내는것 , [그 원소 선택함], 트리계층을 파고들어감
            //여기서 L이 4만족하면 위에 if에서 정답넣어주고 다시 복귀주소인 이부분으로 돌아와서
            // 아래에 방문하지않았을경우 0 으로 내려가서 트리가 오른쪽 자식노드로 가는 것
            ch[L] = 0;
            //dfs 처음 소환한 인자값 위치 포함 안할떄 , 체크한거랑 체크안한거 구분
            DFS(L + 1);
            //오른쪽 자식노드로 보내는것 [그 원소 선택하지 않음]
          }
        }
        DFS(1);
        return answer;
      }

      console.log(solution(3));
    </script>
  </body>
</html>
profile
He threw his knapsack over the brick wall

0개의 댓글