알고리즘뿐만 아니라 유용하게 쓰일만한 고차함수들을 여러 개 정리해 보았다.
map
컬렉션의 각 요소에 동일한 변환을 적용하고, 변환된 요소들로 새로운 배열을 생성한다. 아래와 같이 사용이 가능하다. name in을 $0로 바꿔서 대신할 수 있다.
let names = ["Kim", "Lee", "Park", "Choi"]
let lowercaseNames = names.map { name in
name.lowercased()
}
let lowercaseNames = names.map { $0.lowercased() }
let letterCounts = names.map { $0.count }
print(lowercaseNames) // ["kim", "lee", "park", "choi"]
print(letterCounts) // [3, 3, 4, 4]
filter
컬렉션의 요소 중 주어진 조건을 만족하는 요소만으로 새로운 배열을 생성한다.
let numbers = [1, 2, 3, 4, 5]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [2, 4]
reduce
컬렉션의 모든 요소를 결합하여 하나의 값을 만든다. 초기값과 결합 연산을 받아서 순차적으로 연산한다. 아래와 같이 사용 가능하다.
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { partialResult, number in
partialResult + number
}
let sum = numbers.reduce(0) { $0 + $1 }
let sum = numbers.reduce(0, +)
print(sum) // 15
compactMap
컬렉션의 각 요소를 변환하고, nil이 아닌 결과만을 포함하는 배열을 생성한다.
let strings = ["1", "2", "three", "4", "5"]
let numbers = strings.compactMap { string in
Int(string)
}
let numbers = strings.compactMap { Int($0) }
print(numbers) // [1, 2, 4, 5]
flatMap
중첩된 배열을 평탄화하여 단일 배열로 변환한다.
let numbers = [[1, 2, 3], [4, 5], [6, 7, 8]]
let flattened = numbers.flatMap { $0 }
print(flattened) // [1, 2, 3, 4, 5, 6, 7, 8]
stride
시작 값에서 끝 값까지 일정한 간격으로 반복하는 시퀀스를 생성한다.
for i in stride(from: 0, to: 10, by: 2) {
print(i) // 0, 2, 4, 6, 8
}
for i in stride(from: 0, through: 10, by: 2) {
print(i) // 0, 2, 4, 6, 8, 10
}
prefix
컬렉션의 앞부분 일부를 반환한다.
let numbers = [1, 2, 3, 4, 5]
let firstThree = numbers.prefix(3)
print(firstThree) // [1, 2, 3]
사용법이 여러 가지가 있다. 아래와 같이 다양하게 가져올 수 있다.
let numbers = [1, 2, 3, 4]
// 가져올 요소의 최대 개수를 반환. 컬렉션의 길이가 이보다 작으면 컬렉션의 전체 요소를 반환.
let firstFive = numbers.prefix(5)
print(firstFive) // [1, 2, 3, 4]
// 지정된 인덱스 전까지의 요소를 가져옴.
let upToThree = numbers.prefix(upTo: 3)
print(upToThree) // [1, 2, 3]
// 지정된 인덱스를 포함하여 요소를 가져옴.
let throughThree = numbers.prefix(through: 2)
print(throughThree) // [1, 2, 3]
그리고 특이한것이 있다. prefix(while: (Int) throws -> Bool) 를 사용하게 되면 앞부터 while 뒤의 조건을 만족할 때까지 return 하는 고차함수이다.
let numbers = [1, 2, 3, 4]
let moreThanTwo = numbers.prefix { $0 > 2 }
print(moreThanTwo) // []
let lessThanTwo = numbers.prefix { $0 < 2 }
print(lessThanTwo) // [1]
suffix
컬렉션의 뒷부분 일부를 반환한다.
let numbers = [1, 2, 3, 4, 5]
let lastTwo = numbers.suffix(2)
print(lastTwo) // [4, 5]
한 가지 더 사용방법이 있다. 아래와 같이 from 을 사용하게 되면 index 4부터 끝까지의 배열을 반환한다.
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let suffixFrom = numbers.suffix(from: 4)
print(suffixFrom) // [5, 6, 7, 8, 9, 10]
zip
두 개의 시퀀스를 묶어 쌍으로 이루어진 시퀀스를 생성한다. 두 시퀀스의 길이가 다를 경우, 더 짧은 시퀀스의 길이에 맞춰진다. 만약에 map을 사용하게 되면 아래와 같이도 표현할 수 있다.
let numbers = [1, 2, 3]
let letters = [4, 5, 6, 7]
let zipped = zip(letters, numbers).map { $0 + $1 }
print(zipped)
'→ 알고리즘 관련' 카테고리의 다른 글
[Algorithm] 세그먼트 트리(Segment Tree) Swift로 구현하기 (0) | 2024.07.11 |
---|---|
[Algorithm] Bitmask (비트마스크) (Swift) (0) | 2024.07.02 |
[Algorithm] Union-Find 알고리즘 (Swift) (0) | 2024.06.19 |
[Algorithm] 큐 구현하기 (Swift) (2) | 2024.06.13 |
[Algorithm] Swift로 구현해보는 정렬 알고리즘1 (버블, 선택, 병합 정렬) (0) | 2024.04.11 |