LeetCode - Height Checker 에서 사용한 함수 정리
sort 함수
sort 함수는 배열을 정렬하며, 배열 자체를 수정해서 원본 배열의 순서가 변경된다.
var numbers = [5, 2, 9, 1, 5, 6]
// 오름차순 정렬
numbers.sort()
// 내림차순 정렬
numbers.sort { $0 > $1 }
print(numbers) // 출력: [9, 6, 5, 5, 2, 1]
sorted 함수
sorted 함수는 배열을 정렬한 새로운 배열을 반환해 원본 배열은 변경되지 않는다.
즉, 정렬 된 새로운 배열울 얻고 싶을 때 sorted 함수를 사용한다.
let numbers = [5, 2, 9, 1, 5, 6]
// 오름차순 정렬된 새로운 배열 반환
let ascendingArray = numbers.sorted()
// 내림차순 정렬된 새로운 배열 반환
let descendingArray = numbers.sorted { $0 > $1 }
print(ascendingArray) // 출력: [1, 2, 5, 5, 6, 9]
print(descendingArray) // 출력: [9, 6, 5, 5, 2, 1]
sort 함수와 sorted 함수는 모두 배열의 요소를 정렬하는데 사용되지만, sort 함수는 원본 배열을 변경하고
sorted 함수는 정렬된 새로운 배열을 반환하는 차이가 있다.
zip 함수
두 개 이상의 시퀀스를 조합하여 새로운 시퀀스를 만드는데 사용된다.
zip함수를 사용하면 여러 시퀀스들을 병렬로 순회하며 요소들을 조합할 수 있다.
각 요소를 튜플로 묶어 새로운 시퀀스를 생성하는데 중요한 점은 zip함수가 시퀀스 중 더 짧은 시퀀스의 길이에 맞춰
결과를 생성한다는 것이다.
만약 두 개의 시퀀스를 묶는데 한쪽이 더 짧으면 더 짧은 쪽에 맞춰 결과를 생성한다.
let array1 = [1, 2]
let array2 = ["a", "b", "c"]
let zippedArray = zip(array1, array2)
for (num, letter) in zippedArray {
print("\(num) - \(letter)")
}
이 경우 출력은
1 - a
2 - b
이렇게 array1의 길이가 더 짧기 때문에, array2의 추가 요소는 무시된다.
zip함수는 swift의 Sequence 및 Collection 프로토콜을 따르는 모든 타입에서 사용할 수 있어
배열, 리스트, 세트 등 다양한 시퀀스 타입에 적용할 수 있다.
filter 함수
원본 컨테이너의 값을 특정 조건에 맞게 걸러서 새로운 컨테이너에 담아 변환한다.
필터 함수의 매개변수로 전달되는 함수의 리턴 타입은 Bool이다.
해당 값이 새 컨테이너에 포함될 수 있으면 true, 그렇지 않으면 false를 리턴한다.
let numbers: [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8]
let evenNumbers2: [Int] = numbers.filter { (number: Int) -> Bool in
return number % 2 == 0
}
let oddNumbers: [Int] = numbers.filter { $0 % 2 != 0 }
문제풀이
class Solution {
func heightChecker(_ heights: [Int]) -> Int {
var expected = heights.sorted()
return zip(heights, expected).filter { $0 != $1 }.count
}
}
// 재정렬하고 위치가 바뀐 인덱스 개수 확인
// zip으로 두개 시퀀스를 조합하고 새로운 시퀀스를 만들어 요소를 조합한 다음 서로 다른 값을 가진 값들만 filter로 걸러내 개수 카운트