N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.
첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다.
첫째 줄부터 N!개의 줄에 걸쳐서 모든 순열을 사전순으로 출력한다.
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
n과 m 문제 시리즈에서 구현했던 방식을 사용해 해결하였다.
다음 순열에서 쓴 방식을 마지막 순서의 순열까지 반복해도 된다고 하는데 시간이 남으면 한 번 해보는 것도 좋을 것 같다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int n;
static int[] result;
static boolean[] picked;
static BufferedWriter bw;
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());
picked = new boolean[n + 1];
result = new int[n];
bw = new BufferedWriter(new OutputStreamWriter(System.out));
picking(0);
bw.flush();
bw.close();
}
static void picking(int cnt) throws IOException {
if (cnt == n) {
for (int i = 0; i < n; i++) {
bw.append(result[i] + " ");
}
bw.write("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (!picked[i]) {
picked[i] = true;
result[cnt] = i;
picking(cnt + 1);
picked[i] = false;
}
}
}
}