순열
//Header
private static void permutation(int pickCnt);
//호출 시
permutation(0);
조합
//Header
private static void combination(int idx, int pickCnt);
//호출 시
combination(0,0);
Main Logic
private static void permutation(int pickCnt);
public class Main {
public static int N, C;
public static int origin[], result[];
public static boolean isSelected[];
public static List<int[]> results;
public static void main(String arg[]) {
origin = new int[N];
isSelected = new boolean[N];
result = new int[C];
permutation(0);
}
private static void permutation(int pickCnt) {
if(pickCnt == C)
{
int[] candiate = result.clone();
results.add(candiate);
return;
}
// 해당 자리에 뽑을 가능한 모든 수에 대해 시도
for(int i = 0; i < N; i++)
{
if(isSelected[i]) continue;
result[pickCnt] = origin[i];
//set isSelected true
permutation(pickCnt + 1); // 다음 자리의 순열 뽑기
//set isSelected false
}
}
}
Full Code
public class Main {
//N개의 숫자에서 C개의 숫자로 순열을 만드는 경우
public static int N, C;
//origin: 주어진 N개의 숫자를 담는 배열
//result: 완성된 하나의 순열이 담기는 배열
public static int origin[], result[];
//isSelected: 숫자 사용 여부 체크
public static boolean isSelected[];
//results: result list
public static List<int[]> results = new LinkedList<>();
public static void main(String arg[]) throws IOException {
origin = new int[N];
isSelected = new boolean[N];
result = new int[C];
permutation(0);
}
private static void permutation(int pickCnt) {
if(pickCnt == C)
{
int[] candiate = result.clone();
results.add(candiate);
return;
}
// 해당 자리에 뽑을 가능한 모든 수에 대해 시도
for(int i = 0; i < N; i++)
{
if(isSelected[i]) continue;
result[pickCnt] = origin[i];
isSelected[i] = true;
permutation(pickCnt + 1); // 다음 자리의 순열 뽑기
isSelected[i] = false;
}
}
}
정답 코드
import java.io.*;
import java.util.*;
public class BOJ15649 {
//N개의 숫자에서 C개의 숫자로 순열을 만드는 경우
public static int N, C;
//origin: 주어진 N개의 숫자를 담는 배열
//result: 하나의 순열이 담기는 배열
public static int origin[], result[];
//isSelected: 숫자 사용 여부 체크
public static boolean isSelected[];
//results: result list
public static List<int[]> results = new LinkedList<>();
public static void main(String arg[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String input[] = br.readLine().split(" ");
N = Integer.parseInt(input[0]);
C = Integer.parseInt(input[1]);
origin = new int[N];
isSelected = new boolean[N];
result = new int[C];
for (int i = 0; i < N; ++i)
origin[i] = i+1;
permutation(0);
}
private static void permutation(int idx){
if(idx == C){
int[] candiate = result.clone();
results.add(candiate);
return;
}
// 해당 자리에 뽑을 가능한 모든 수에 대해 시도
for(int i = 0; i < N; i++){
if(isSelected[i]) continue;
result[idx] = origin[i];
isSelected[i] = true;
permutation(idx + 1); // 다음 자리의 순열 뽑기
isSelected[i] = false;
}
}
}
Main Logic
public static void combination(int idx, int pickCnt);
public class Main {
public static int N,C;
public static int[] origin;
public static boolean[] isSelected;
public static int[] picked;
public static List<int[]> results = new LinkedList<>();
public static void combination(int idx, int pickCnt) {
if (pickCnt == C)
{
int[] candidate = picked.clone();
results.add(candidate);
return;
}
if (idx == N)
{
return;
}
if (!isSelected[idx])
{
isSelected[idx] = true;
picked[pickCnt] = origin[idx];
//하나를 더 뽑고 다음 depth로 이동
combination(idx + 1, pickCnt + 1);
isSelected[idx] = false;
}
//하나를 더 뽑지 않고 다음 depth로 이동
combination(idx + 1, pickCnt);
}
public static void main(String[] args) throws IOException {
origin = new int[N];
isSelected = new boolean[N];
picked = new int[C];
combination(0,0);
}
}
Full Code
public class Main {
//N개의 숫자에서 C개의 숫자를 뽑아 조합을 만드는 경우
public static int N,C;
//origin: 주어진 N개의 숫자를 담는 배열
public static int[] origin;
//isSelected: 숫자 사용 여부 체크
public static boolean[] isSelected;
//result: 완성된 하나의 조합이 담기는 배열
public static int[] picked;
//results: result list
public static List<int[]> results = new LinkedList<>();
public static void combination(int idx, int pickCnt) {
if (pickCnt == C)
{
int[] candidate = picked.clone();
results.add(candidate);
return;
}
if (idx == N)
{
return;
}
if (!isSelected[idx])
{
isSelected[idx] = true;
picked[pickCnt] = origin[idx];
//하나를 더 뽑고 다음 depth로 이동
combination(idx + 1, pickCnt + 1);
isSelected[idx] = false;
}
//하나를 더 뽑지 않고 다음 depth로 이동
combination(idx + 1, pickCnt);
}
public static void main(String[] args) throws IOException {
origin = new int[N];
isSelected = new boolean[N];
picked = new int[C];
combination(0,0);
}
}
정답 코드
package BOJ;
import java.io.*;
import java.util.*;
public class BOJ15650 {
public static int N,C;
public static int[] origin;
public static boolean[] isSelected;
public static int[] picked;
public static List<int[]> results = new LinkedList<>();
public static void combination(int idx, int pickCnt) {
if (pickCnt == C)
{
int[] candidate = picked.clone();
results.add(candidate);
return;
}
if (idx == N)
{
return;
}
if (!isSelected[idx])
{
isSelected[idx] = true;
picked[pickCnt] = origin[idx];
combination(idx + 1, pickCnt + 1);
isSelected[idx] = false;
}
combination(idx + 1, pickCnt);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] info = br.readLine().split(" ");
N = Integer.parseInt(info[0]);
C = Integer.parseInt(info[1]);
origin = new int[N];
isSelected = new boolean[N];
picked = new int[C];
for (int i = 0; i < N; ++i)
origin[i] = i + 1;
combination(0,0);
for (int[] result : results)
{
StringBuilder sb = new StringBuilder();
for (int number : result)
{
sb.append(number);
sb.append(" ");
}
bw.append(sb.toString());
bw.newLine();
}
bw.flush();
bw.close();
br.close();
}
}