백트래킹의 묘미는 "가보고 아니면 되돌아오는 것"입니다.
used): 현재 경로에서 어떤 숫자를 사용 중인지 기록하여 중복 선택을 방지합니다.Deque): 현재 선택한 숫자들을 순서대로 저장합니다. Deque에서 제거하고 used 상태도 false로 되돌려 다른 경로에서 해당 숫자를 쓸 수 있게 합니다.import java.io.*;
import java.util.*;
public class Main {
static boolean[] used;
static Deque<Integer> dq = new ArrayDeque<>();
static int n, m;
static final StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws Exception {
// ... (입력 로직 생략)
used = new boolean[n + 1];
backtrack(0);
System.out.print(sb);
}
static void backtrack(int k) {
// M개를 모두 골랐다면 결과 저장 (Base Case)
if (k == m) {
for (int e : dq) sb.append(e).append(" ");
sb.append("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (!used[i]) { // 사용하지 않은 숫자라면
used[i] = true; // 1. 상태 결정
dq.addLast(i);
backtrack(k + 1); // 2. 다음 단계로
dq.pollLast(); // 3. 상태 복구 (Backtrack)
used[i] = false;
}
}
}
}
Deque vs int[]: 보통은 결과용 배열 ans[m]을 선언해서 인덱스로 관리하지만, Deque을 사용하면 add/poll 직관성이 높아져 로직 흐름을 파악하기 좋습니다.used[i] = false 처리를 잊는 순간 탐색 가능한 경로가 급격히 사라져 오답이 나옵니다. 백트래킹의 핵심은 언제나 '원상복구'입니다.