Swift로 LetCode-Squares of a Sorted Arry 설명
개막사
스위프트로 Sort 알고리즘을 써본 적이 없는 사람에게는 좋은 학습 문제다.
문제.
문제.
난이도
Squares of a Sorted Array
easy
整数の配列 nums が小さい順にソートされています。
各数値を2乗した配列を小さい順にソートして返します。
를 보충으로 다음과 같은 실제 테스트 용례를 제공하였다.Input: nums = [-4,-1,0,3,10]
Output: [0,1,9,16,100]
테스트 용례의 계산 과정은 다음과 같다.답안
1. Swift API 사용 방법
func sortedSquares(_ A: [Int]) -> [Int] {
return A.map { $0 * $0 }.sorted()
}
Swift에는 sorted
방법이 있습니다.sorted
메서드 내부에는 여러 개의 Sort 알고리즘이 조합되어 있습니다.따라서 스스로 Sort 알고리즘을 설치하기보다는 이를 사용하는 것이 더 빠르다.(참조: Swift 정렬 방법
하지만 이번에는 알고리즘을 사용하는 방법을 봐야 한다.
2. Sort 알고리즘을 사용하는 방법
정렬 알고리즘이 몇 개 있는데 이번에는 두 가지를 소개합니다.
① Bubble Sort(거품 정렬)
인접 요소의 값을 비교하고 조건에 따라 교환하는 알고리즘.
(참조: 간단한 거품 정렬 기준
그럼 실제 코드를 봅시다.
func sortedSquares(_ A: [Int]) -> [Int] {
// ① 2乗した配列を作る
var result = [Int]()
for n in A {
result.append(n*n)
}
// ② ソートしていく
var isSwapped = true
while isSwapped {
// 一度でも値の交換をした場合は、再度比較をし直すためのフラグ
isSwapped = false
// 最初から数字を比較していく
// 中の計算で'i-1'をしても問題ないように'0'ではなく'1'から始まっている
for i in 1..<result.count {
// 隣り合う数字の比較
guard result[i] < result[i-1] else { continue }
// 該当する場合は'swapAt'で値を交換する
result.swapAt(i, i-1)
isSwapped = true
}
}
return result
}
도 재기 함수를 사용하는 문법이 있는데 이번에는 while
와フラグ
로 쓴다.이번 소개는 버블 소트가 평균적으로 비교되기 때문에 계산량이 매우 많고 시간이 오래 걸리기 때문이다.이 문제에 사용하면 시간 초과가 유감입니다.
그럼 이보다 빠른 Sort 알고리즘을 살펴봅시다.
② Merge Sort(병합 정렬)
정렬되지 않은 목록을 두 개의 목록으로 나누어 각각 정렬한 다음 그것들을 하나의 (통합) 알고리즘으로 통합시킨다.
(참조: 소스 코드 탐험대, 총 1870개, 알고리즘과 데이터 구조, 총 18.6개, 통합 정렬
그럼 실제 코드를 봅시다.
func sortedSquares(_ A: [Int]) -> [Int] {
// ① 2乗した配列を作る
var squaredNums = [Int]()
for n in A {
squaredNums.append(n*n)
}
// ② ソートしていく & ③ 合成する
return mergeSort(squaredNums)
}
func mergeSort(_ lists: [Int]) -> [Int] {
guard 1 < lists.count else { return lists }
// ②-1 配列を2つに分割
let count = lists.count
let left = Array(lists[..<Int(count/2)])
// ②-2 分割した個々の配列をソートし続ける
let right = Array(lists[count/2...count-1])
return merge(left: mergeSort(left), right: mergeSort(right))
}
func merge(left: [Int], right: [Int]) -> [Int] {
var left = left, right = right, result = [Int]()
// ③-1 2つの配列から最初の値を見て、小さい値から順にリストに追加していくことで、2つの配列を合成していく
while 0 < left.count && 0 < right.count {
// `removeFirst`で追加した方の先頭の値を除外していく
if left[0] <= right[0] {
result.append(left.removeFirst())
} else {
result.append(right.removeFirst())
}
}
// ③-2 `while`ではいずれかが'0'になった時に処理が終わってしまうので、最後の値を配列に追加する
result.append(contentsOf: left)
result.append(contentsOf: right)
return result
}
메르지소트에는 각각'sort
할 함수'와'merge
할 함수'가 준비돼 있다.언뜻 보기에는 코드량이 많지만 버블 소트와 달리 각 배열을 보면서 비교값의 계산량을 줄인다.Sort 두 개를 소개했고 알고리즘도 몇 개 더 있으니 관심 있는 분들은 조사해 보세요.
실행 결과
Kind
Runtime
Memory
sorted()
380ms~
16MB 정도
Bubble Sort
Time Limit Exceeded
-
Merge Sort
740ms~
16MB 정도
인용하다
Reference
이 문제에 관하여(Swift로 LetCode-Squares of a Sorted Arry 설명), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hcrane/articles/leetcode-swift-977텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)