문제 : https://www.acmicpc.net/problem/10974

Key Point

1
2
3
do{

}while();

잘 사용하지 않은 반복문을 사용해서 첫번째 순열을 찍고 다음 순열을 계속해서 찍어내면 된다.
do ~ while문을 사용하지 않으면 사전순으로 첫 번째에 위치한 순열을 찍어낼 수 없으므로 do ~ while문을 사용한다.
Explain
이전 순열과 모든 순열을 구하는 문제를 하나로 합치면 된다.

Code

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Exam10974 {

public static boolean next_permutation(int[] a) {
int i = a.length-1;
while(i>0 && a[i-1]>=a[i]) {
i--;
}

if(i<=0) {
return false;
}

int j = a.length-1;
while(a[j]<=a[i-1]) {
j--;
}

int tmp = a[i-1];
a[i-1] = a[j];
a[j] = tmp;

j = a.length-1;
while(i<j) {
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
i++;
j--;
}
return true;
}

public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
int[] a = new int[N];
for(int i=0;i<N;i++) {
a[i] = i+1;
}

do {
for(int i=0;i<N;i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}while(next_permutation(a));

}

}