https://www.acmicpc.net/problem/15649
N과 M이 주어졌을 때N까지 자연수 중 중복 없이 M개를 고른 수열을 출력순열을 구하는 문제입니다.
private static void dfs(int idx) {
if (idx == m) { // 모두 선택되었다면
for (int i : li) sb.append(i).append(" "); // 값들을 StringBuilder에 삽입
sb.append("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (!visited[i]) { // 방문하지 않은 자연수면
visited[i] = true; // 방문 처리
li[idx] = i; // 배열에 값 삽입
dfs(idx + 1); // 재귀
visited[i] = false; // 백트래킹
}
}
}
재귀를 돌며 선택되지 않은 수들을 배열에 넣고 출력하면 간단하게 해결할 수 있습니다.
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
static int n, m;
static boolean[] visited;
static int[] li;
private static void dfs(int idx) {
if (idx == m) {
for (int i : li) sb.append(i).append(" ");
sb.append("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
visited[i] = true;
li[idx] = i;
dfs(idx + 1);
visited[i] = false;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
visited = new boolean[n+1];
li = new int[m];
dfs(0);
System.out.println(sb.toString());
}
}