Nevertheless

[JS] N과 M(1) 본문

코딩테스트/Baekjoon

[JS] N과 M(1)

hxx_1 2025. 5. 27. 16:17

"백트래킹" 이란? 

모든 가능한 경우의 수를 탐색하면서, 해가 될 수 없는 경우를 미리 배제(가지치기) 하여 효율적으로 문제를 해결하는 알고리즘 기법. 주로 재귀와 깊이 우선 탐색을 활용해 구현하며, 대표적으로 조합, 순열, N-Queen, 미로 찾기 등 다양한 탐색 문제에 적용된다. 

 

핵심 원리

  • 어떤 문제의 해를 찾는 도중, 현재 경로가 조건에 맞지 않거나 해가 될 수 없다고 판단되면, 그 경로의 탐색을 중단하고 이전 단계 (Backtrack) 로 되돌아가 다른 선택지를 탐색한다.
  • 이렇게 불필요한 경로를 조기에 차단하는 과정을 가지치기 라고 하며, 이 덕분에 경우의 수를 크게 줄일 수 있다. 

https://www.acmicpc.net/problem/15649

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
let [n,m] = input[0].split(" ").map(Number);
let visited = new Array(n+1).fill(false);

function dfs(depth, arr){
  if(depth == m){
    console.log(arr.join(" "));
    return;
  }

  for(let i=1;i<=n;i++){
    if(!visited[i]){
      visited[i] = true;
      arr.push(i);
      dfs(depth+1, arr);
      arr.pop();
      visited[i] = false;
    }
  }
}

dfs(0,[]);

 

✏️ 풀이 방법

위와 같은 방법을 계속 반복을 하면 된다. visited 를 이용해서 모든 경우의 수가 끝나면 마지막에는 visited 를 false 로 변경해줘서, 해당 숫자의 탐색이 가능하게 바꿔준다. 예를 들면 [1,2], [1,3], [1,4] 를 다 탐색한 후에는 visited[1]=false 로 변경해서 그 다음 숫자 2가 [2,1] 이런식으로 탐색이 가능하게 해줘야한다. 

 

✍🏻 느낀점

 

dfs 는 할 때마다 헷갈리는 것 같다. 게다가 백트래킹을 하니까 뭔가 dfs 함수 매개변수가 많아져서 처음에 어떻게 해야할지 감이 잘 안잡혔다. 그래도 손으로 직접 해보니 어느 정도 이해가 갔다. 더 익숙해질 수 있도록 N과 M 시리즈를 다 풀어봐야겠다. 

'코딩테스트 > Baekjoon' 카테고리의 다른 글

[JS] N과 M(2)  (0) 2025.05.28
[JS] 백준 14503번: 로봇 청소기  (1) 2025.05.23
[JAVA] 백준 12873번: 기념품  (0) 2024.05.15
[JAVA] 백준 5212번: 지구 온난화  (0) 2024.05.13
[JAVA] 백준 26215번: 눈 치우기  (0) 2024.05.12