programmers.co.kr/learn/courses/30/lessons/12915
안녕하세요!!! 후르륵짭잡 입니다.
이번에는 정렬을 배워 보려 합니다.
Swift에서 마음대로 정렬하기 위해서는 Sorted를 알아야합니다.
처음에는 sorted를 알았지만 방식을 잘 몰랐기 때문에 결국 삽입정렬로 풀었습니다.
func solution(_ strings:[String], _ n:Int) -> [String] {
var answer : [String] = []
for index in 0..<strings.count {
let indexElement = Array(strings[index])
var start = answer.count - 1
answer.append(strings[index])
while start >= 0 {
let startElement = Array(answer[start])
if indexElement[n] < startElement[n] {
answer[start + 1] = answer[start]
}
else if indexElement[n] == startElement[n] && strings[index] < answer[start]{
answer[start + 1] = answer[start]
}
else{
break
}
start -= 1
}
answer[start + 1] = strings[index]
}
return answer
}
근데,,,, 이런 방법은 O(N^2)이기 때문에 매우 비효율적입니다.
결국 Sorted 방식을 분석하기로 했습니다.
처음에 Sorted를 사용하니 " < " 은 작은 것이 앞으로 (오름차순)
" > "은 작은 것이 뒤쪽으로 (내림차순) 정렬이 됩니다.
또한 시간 복잡도는 O(nLog^n)이 된다고 합니다.
이 문제를 풀 때, 처음에는
func WrongSolution(_ strings:[String], _ n:Int) -> [String]{
return strings.sorted { (index1, index2) -> Bool in
let elementArray1 = Array(index1)
let elementArray2 = Array(index2)
if elementArray1[n] == elementArray2[n] {
return index1 < index2
}
else if elementArray1[n] < elementArray2[n]{
return index1 < index2
}
return index1 > index2
}
}
이 코드 처럼 모든 상황에 대해서 다 나눠주었는데,,, 적용이 되지 않았다.
오히려 코드를
func WrongSolution(_ strings:[String], _ n:Int) -> [String]{
return strings.sorted { (index1, index2) -> Bool in
let elementArray1 = Array(index1)
let elementArray2 = Array(index2)
if elementArray1[n] == elementArray2[n] {
return index1 < index2
}
return elementArray1[n] < elementArray2[n]
}
}
이렇게 간출였더니 오히려 정답이였다.
그리고 새로운 것을 테스트 해봤다.
struct Info {
let name : String
let age : Int
}
let list = [Info(name: "a", age: 12),Info(name: "b", age: 12),Info(name: "c", age: 42),Info(name: "d", age: 64),Info(name: "e", age: 12),Info(name: "f", age: 15)]
func sortSolution(_ list : [Info]) -> [Info]{
return list.sorted { (element1, element2) -> Bool in
if element1.age == element2.age{
return element1.name < element2.name
}
else if element1.age < element2.age{
return element1.name < element2.name
}
return element1.age > element2.age
}
}
print(sortSolution(list))
이 코드를 돌렸는데, 여전히 else if 부분이 작동 되지 않았다.
이것을 보아 조건문에서는 == 부분만 케이스를 나눠줘야하고
상하 비교문은 조건을 나눠주는 것이 아니라 기본적으로 오른차순을 할 것인지 아니면 내림차순을 할 것인지
하나만 정해줘야 하는 것 같다.....
그런데,,,
func RightSolution(_ strings:[String], _ n:Int) -> [String]{
return strings.sorted { (index1, index2) -> Bool in
if Array(index1)[n] == Array(index2)[n] {
return index1 < index2
}
else if Array(index1)[n] < Array(index2)[n] {
return Array(index1)[n] < Array(index2)[n]
}
return false
}
}
이렇게 하니 비교 연산자를 주었는데 되었다!
developer.apple.com/documentation/swift/array/2296815-sorted
불러오는 중입니다...
애플 공식 문서를 보니
첫 번째 인수를 두 번째 인수보다 먼저 정렬해야하는 경우 true를 리턴하는 술어. 그렇지 않으면 false입니다.
그러니 앞과 뒤를 비교할 때 비교 연산자를 선택하는 것 보다는 true 와 false를 사용하는게 맞는 거 같다.
일단 정리하자면
1) 기본적으로 오름차순 정렬인지 내림차순 정렬인지 정하고 마지막 return 부분에 기본적인 정렬 방식을 넣어준다
2) 아니면 모든 부분에 비교 연산자를 넣어주지만 true, false로 나눠줘야한다.
'Xcode > Swift - Algorithm' 카테고리의 다른 글
Swift) LeetCode(Easy) - Maximum Subarray(DP) (0) | 2020.07.08 |
---|---|
Swift) LeetCode(Easy) - Two Sum (Dictionary) (0) | 2020.07.08 |
Swift) 프로그래머스(Lv1) 문자열 내 p와 y의 개수 (LowerCase) (0) | 2020.07.07 |
Swift ) BOJ- 11053 가장 긴 증가하는 부분 수열(Lower Bound) (0) | 2020.07.03 |
Swift)BOJ - 1699 제곱수의 합(DP) (0) | 2020.07.03 |
댓글