순열 Permutation
서로다른 n개의 원소에서 r개를 중복 없이 순서와 상관있게 선택 혹은 나열하는것이다.
ex) [1, 2, 3]의 배열에서 두개의 원소를 뽑는다고 한다면
[1,2], [1,3], [2,1], [2,3], [3,1], [3,2]이 된다.
여기서 [1,2] 와 [2,1]은 들어있는 원소는 같지만, 순서가 다르기때문에 다른 경우의수로 판단한다.
import Foundation
// 순열
func permutation(_ targetArr: [Int],_ targetNum: Int,_ arr: [Int]) {
// 뽑으려는 갯수와 동일한경우
if arr.count == targetNum {
print(arr)
return
}
// 순열은 순서가 상관있는 뽑기방식으로, [2,1] != [1,2]이다.
// 그러므로 반복문을 처음부터 시작한다.
for i in 0..<targetArr.count {
// 중복되는값이 아니라면 추가한다.
if !arr.contains(targetArr[i]) {
permutation(targetArr, targetNum, arr + [targetArr[i]])
}
}
}
permutation([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]
조합 Combination
서로다른 n개의 원소에서 r개를 중복없이 순서와 상관없게 선택 혹은 나열하는것이다.
ex) [1, 2, 3]의 배열에서 두개의 원소를 뽑는다고 한다면
[1,2], [1,3], [2,3]이 된다.
순열과 다르게 순서와 상관이 없으므로 [1,2], [2,1]은 같은 경우의수로 판단한다
import Foundation
// 조합
func combi(_ targetArr: [Int],_ targetNum: Int,_ index: Int,_ arr: [Int]) {
// 뽑으려는 수만큼 뽑았다면 출력
if arr.count == targetNum {
print(arr)
return
}
// 순열과 다르게 순서가 달라도 들어있는 원소가 같다면 같은 경우의 수로 판단한다.
// 그래서 뽑은 원소 바로 다음 원소를 추가하고 재귀호출
for i in index..<targetArr.count {
combi(targetArr, targetNum, i+1, arr + [targetArr[i]])
}
}
combi([1,2,3,4], 2, 0, [])
// 출력
//[1, 2]
//[1, 3]
//[1, 4]
//[2, 3]
//[2, 4]
//[3, 4]
※ 틀린 부분이나 오류나는 부분 알려주시면 감사하겠습니다 (_ _)
'코딩테스트 > 알고리즘' 카테고리의 다른 글
다익스트라 알고리즘 Swift (0) | 2024.04.24 |
---|---|
투포인터 알고리즘 Swift (0) | 2024.04.14 |
깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS) Swift (1) | 2024.04.08 |
이분탐색 Swift (1) | 2024.04.06 |
동적계획법 DP(Dynamic Programming) (0) | 2023.04.20 |