https://leetcode.com/problems/permutations/
코드설명
깊이우선탐색(DFS) + 비트마스킹(BitMask)을 활용합니다.
일반적인 순열 탐색 방식입니다.
코드
정답코드1입니다.
class Solution {
public List<List<Integer>> permute(int[] nums) {
return DFS(0, new int[nums.length], nums, (1 << (nums.length + 1) ), new ArrayList<>() );
}
List<List<Integer>> DFS(int level, int[] A, int[] nums, int visited, List<List<Integer>> answer){
if(level == nums.length){
List<Integer> arr = new ArrayList<>();
for(int i=0; i<A.length; i++) arr.add(A[i]);
answer.add(arr);
return answer;
}
for(int i=0; i<nums.length; i++){
if( (visited & (1 << i) ) == 0 ){
visited |= (1 << i);
A[level] = nums[i];
answer = DFS(level + 1, A, nums, visited, answer);
visited &= ~(1 << i);
}
}
return answer;
}
}
정답코드2입니다.
class Solution {
public List<List<Integer>> permute(int[] nums) {
return DFS(0, new int[nums.length], nums, (1 << (nums.length + 1) ), new ArrayList<>() );
}
List<List<Integer>> DFS(int level, int[] A, int[] nums, int visited, List<List<Integer>> answer){
if(level == nums.length){
List<Integer> arr = new ArrayList<>();
for(int i=0; i<A.length; i++) arr.add(A[i]);
answer.add(arr);
return answer;
}
for(int i=0; i<nums.length; i++){
if( (visited & (1 << i) ) == 0 ){
visited += (1 << i);
A[level] = nums[i];
answer = DFS(level + 1, A, nums, visited, answer);
visited &= ~(1 << i);
}
}
return answer;
}
}