Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 브랜치
- npm
- post
- 백준n과 m(2)js
- gui
- 백준n과 m(2)
- 백준15649번js
- 자바
- 객체
- 깃
- 좋아요추가
- 리액트
- 파이프라인
- CS
- 백준n과m(1)
- 프로그래머스
- 컴퓨터공학
- API
- 예외처리
- 오픈소스
- 데이터베이스
- 깃허브
- js
- 웹
- 백준n과m(1)js
- 타입스크립트
- 자바스크립트
- 리팩토링
- Node.js
- Express
Archives
- Today
- Total
Nevertheless
[JS] N과 M(1) 본문
"백트래킹" 이란?
모든 가능한 경우의 수를 탐색하면서, 해가 될 수 없는 경우를 미리 배제(가지치기) 하여 효율적으로 문제를 해결하는 알고리즘 기법. 주로 재귀와 깊이 우선 탐색을 활용해 구현하며, 대표적으로 조합, 순열, 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 |