46. Permutations
Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order.
Example 1:
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Example 2:
Input: nums = [0,1]
Output: [[0,1],[1,0]]
Example 3:
Input: nums = [1]
Output: [[1]]
Swift로 순열을 구하는 코드를 찾다가 풀게 된 문제!
(Swift에서는 순열, 조합을 일일이 구해야 하기 때문에..한 번 제대로 정리할 겸 문제도 풀어보았다.)
생각 과정
만약 [1, 2, 3]이라는 배열의 순열을 구해야한다고 생각해보자.
아직 담기지 않은(visited == false) 숫자를 담는 걸 반복해서 총 3 길이의 배열이 배출되면 성공이다.
배열이 완성되었다면 담겼다는 표시(visited == true)를 다시 담기지 않음으로 바꾼 뒤, 그 다음 숫자로 넘어간다. (일종의 DFS라고도 볼 수 있겠다.)
배출된 배열들을 한데 모으면 모든 순열을 구할 수 있다.
풀이 과정
permutation이라는 함수를 만들어 이 함수를 재귀 호출할 것이다.
class Solution {
func permute(_ nums: [Int]) -> [[Int]] {
var result: [[Int]] = [] // 모든 순열을 저장하는 result
var visited = [Bool](repeating: false, count: nums.count) // 방문했는지 확인하는 visited
func permutation(_ temp: [Int]) {
if temp.count == nums.count { // 순열의 길이가 원본 배열의 길이와 같다면 순열이 완성된 것이므로 result에 추가(배출)
result.append(temp)
}
for i in 0...nums.count - 1 {
if visited[i] == true { // 이미 방문한 숫자라면 continue
continue
} else { // 방문하지 않은 숫자라면 순열에 포함(방문했음을 체크)하여 그 뒷부분 순열을 구하기
visited[i] = true
permutation(temp + [nums[i]])
visited[i] = false // 뒷부분이 모두 완료되었다면 방문했음을 체크 해제하여 다음 숫자로 넘어가기
}
}
}
permutation([]) // 빈 순열로 시작해 0번째 인덱스부터 채워나간다
return result
}
}
참고
'공부하자! > 알고리즘' 카테고리의 다른 글
백준 | 9461 파도반 수열 Swift - DP (0) | 2023.07.18 |
---|---|
백준 | 9095 1, 2, 3 더하기 Swift - DP (0) | 2023.07.18 |
백준 21608 상어 초등학교 Swift - 구현 (0) | 2023.06.20 |
백준 1913 달팽이 Swift - 구현 (0) | 2023.05.23 |
백준 20546 기적의 매매법 Swift - 구현 (0) | 2023.05.23 |