더 엄밀하게는 다음과 같다.
배열을 오름차순 정렬해 가장 작은 순열을 한 번 처리한다.
[1, 2, 4, 3]에 대해 다시 2~4를 수행하면 다음과 같다(현재 i
= 2).
import java.util.*;
public class NPTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] input = new int[n];
for(int i = 0; i < n; input[i++] = sc.nextInt());
Arrays.sort(input);
do {
System.out.println(Arrays.toString(input));
} while(np(input));
sc.close();
}
private static boolean np(int[] p) { //p: 다음 순열을 뽑아낼 배열
/** 1.
* 꼭대기 위치 <code>i</code>를 뒤쪽에서부터 찾는다.
*/
int n = p.length;
int i = n - 1;
while(i > 0 && p[i - 1] >= p[i]) --i;
if(i == 0) {
//현재 순열은 만들 수 있는 가장 큰 순열임을 의미함
//즉 다음 순열이 없음
return false;
}
/**
* 2.
* <code>i - 1</code>에 교환할 한 단계 큰 수의 위치
* <code>j</code>를 뒤쪽부터 찾음
*/
int j = n - 1;
while(p[i - 1] >= p[j]) --j;
/**
* 3.
* <code>i - 1</code>위치의 수와 한 단계 큰 수 swap
*/
swap(p, i - 1, j);
/*
* 4.
* 꼭대기 자리부터 맨 뒤까지의 수를 오름차순 정렬
*/
int k = n - 1;
while(i < k) swap(p, i++, k--);
/*
* 5.
* 다 끝났음
* 배열 자체를 수정했으므로 굳이 새로 배열을 만들 필요는 없음
*/
return true;
}
private static void swap(int[] p, int a, int b) {
p[a] ^= p[b];
p[b] ^= p[a];
p[a] ^= p[b];
}
}
import java.util.*;
public class CombinationNPTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int r = sc.nextInt();
int[] input = new int[n];
for(int i = 0; i < n; input[i++] = sc.nextInt());
Arrays.sort(input);
int[] p = new int[n];
int count = 0;
while(++count <= r) p[n - count] = 1;
do {
for(int i = 0; i < n; ++i) {
if(p[i] == 0) continue;
System.out.print(input[i] + "\t");
}
System.out.println();
//System.out.println(Arrays.toString(input));
} while(np(p));
sc.close();
}
private static boolean np(int[] p) { //p: 다음 순열을 뽑아낼 배열
int n = p.length;
int i = n - 1;
while(i > 0 && p[i - 1] >= p[i]) --i;
if(i == 0) { return false; }
int j = n - 1;
while(p[i - 1] >= p[j]) --j;
swap(p, i - 1, j);
int k = n - 1;
while(i < k) swap(p, i++, k--);
return true;
}
private static void swap(int[] p, int a, int b) {
if(p[a] == p[b]) return;
p[a] ^= p[b];
p[b] ^= p[a];
p[a] ^= p[b];
}
}