class Solution {
public List<List<Integer>> answer = new ArrayList<>();
public List<Integer> list = new ArrayList<>();
public void permutation(int[] nums, int[] out, boolean[] visited, int depth){
if(depth == nums.length){
for(int num : out) list.add(num);
answer.add(list);
list = new ArrayList<>();
return;
}
for(int i = 0 ; i < nums.length; i++){
if(!visited[i]){
visited[i] = true;
out[depth] = nums[i];
permutation(nums, out, visited, depth+1);
visited[i] = false;
}
}
}
public List<List<Integer>> permute(int[] nums) {
boolean[] visited = new boolean[nums.length];
permutation(nums, new int[nums.length], visited, 0);
return answer;
}
}
서로 다른 n 개 중 순서있게 r 개를 뽑은 것
public void permutation(int[] arr, int[] out, boolean[] visited, int depth, int r){
if(depth == r) {
for(int num : out) System.out.println(num);
return;
}
for(int i = 0 ; i < arr.length ; i++){
if(!visited[i]){
visited[i] = true;
out[depth] = arr[i];
permutation(arr, out, visited, depth+1, r);
//첫번째 원소부터 탐색
visited[i] = false;
}
}
}
arr = [1,2,3,4]
//2개 조합
[1,2]
[1,3]
[1,4]
[2,1]
[2,3]
[2,4]
[3,1]
[3,2]
[3,4]
[4,1]
[4,2]
[4,3]
=> 12가지
서로 다른 n 개 중 순서있고, 중복을 포함하는 r개를 뽑은 것
public void permutationWithDuplication(int[] arr, int[] out, int depth, int r){
if(depth == r) {
for(int num : out) System.out.println(num);
return;
}
for(int i = 0 ; i < arr.length ; i++){
out[depth] = arr[i];
permutationWithDuplication(arr, out, depth+1, r);
//첫번째 원소부터 탐색
}
}
}
arr = [1,2,3,4]
//중복 순열 2개 뽑기
[1,1]
[1,2]
[1,3]
[1,4]
[2,1]
[2,2]
[2,3]
[2,4]
[3,1]
[3,2]
[3,3]
[3,4]
=> 16가지