
난이도: ★★☆☆☆ • solved on: 2026-01-20

자료구조
int[] : 현재 선택된 수열을 저장boolean[] : 숫자 사용 여부(중복 방지) 체크StringBuilder : 출력 성능 최적화알고리즘/기법
핵심 키워드
1. 문제 분해
- 길이가 M인 수열을 만든다.
- 각 자리에 1부터 N까지의 숫자를 하나씩 시도한다.
- 이미 사용한 숫자는 다시 사용할 수 없다.
- 길이가 M이 되면 하나의 완성된 순열로 출력한다.
2. 재귀 함수의 목적 정의 (핵심)
sequence(n, depth)의 역할
depth == M
→ 길이 M의 수열이 완성되었으므로 출력하고 종료한다.- 그렇지 않으면
→ 1부터 N까지 순회하면서 아직 사용하지 않은 숫자를 선택한다.
3. 핵심 로직 흐름
sequence(depth): if depth == M: 수열 출력 return for i = 1 to N: if i가 아직 사용되지 않았다면: i를 선택 sequence(depth + 1) i 선택 취소 (상태 복원)
4. 백트래킹의 본질
- 선택:
visited[i] = true,tempArr[depth] = i- 재귀 호출: 다음 자리로 이동
- 복원:
visited[i] = false
import java.util.*;
class Main {
public static int[] tempArr;
public static boolean[] visited;
public static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int r = sc.nextInt();
tempArr = new int[r];
visited = new boolean[n + 1];
sequence(n, 0);
System.out.println(sb);
}
public static void sequence(int n, int depth) {
if (depth == tempArr.length) {
for (int i = 0; i < tempArr.length; i++) {
sb.append(tempArr[i]).append(" ");
}
sb.append("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
visited[i] = true;
tempArr[depth] = i;
sequence(n, depth + 1);
visited[i] = false; // 상태 복원
}
}
}
}
선택 → 재귀 → 복원 이 3단계가 항상 세트로 움직인다.depth는 현재까지 몇 개를 골랐는지를 의미하는 지표로 이해하면 훨씬 명확해진다.비슷한 유형 (GPT 추천)
확장 문제 (GPT 추천)