Level 3 정답률 60퍼로 난이도를 많이 높여봤다. 배열 내부 원소들을 다루기가 까다로웠다.
I를 포함하는지 여부는 간단한데, I+" "+숫자에서 숫자만 쏙 빼서 추가하는 함수를 어떻게 구현해야할지를 모르겠다.
우선 배열을 순회하며 공백에 따라 분리한 뒤 인덱스를 조정하는 느낌으로 해봐야할것같다.
import Foundation
func solution(_ operations:[String]) -> [Int] {
var queue = [Int]()
for i in operations{
let operation = i.components(separatedBy: " ")
let command = operation[0]
let number = Int(operation[1])!
if command == "I" {
queue.append(number)
} else if command == "D 1" {
queue.sort()
queue.removeLast()
} else if command == "D -1" {
queue.sort()
queue.removeFirst()
}
}
queue.sort()
return [queue.last!, queue.first!]
}
오류를 수정해가며 이런 느낌으로 해봤는데 정답이 나오지 않았다. 오류가 나오지않은것은 고무적이다.
문제는 D 1일때도 D와 1을 분리해서 1을 저장해버리는것이 문제일 것이다.
import Foundation
func solution(_ operations:[String]) -> [Int] {
var queue = [Int]()
for i in operations{
let operation = i.components(separatedBy: " ")
let command = operation[0]
let number = Int(operation[1])!
if command == "I" {
queue.append(number)
} else if command == "D" {
if number == 1 {
queue.sort()
queue.removeLast()
} else {
queue.sort()
queue.removeFirst()
}
}
}
queue.sort()
if queue.isEmpty {
return [0, 0]
} else{
return [queue.last!, queue.first!]
}
}
이렇게 다시 해봤는데 core dumped 오류가 발생했다. 끝끝내 어디서 오류가 발생한지는 찾지 못했고 아마 예상가는 부분은 강제 바인딩 ! 을 많이 사용해서 그 과정에서 오류가 발생 한 것 같다. 답안지를 찾아보았다.
if command == "I" {
let number = Int(operation[1])!
queue.append(number)
} else if command == "D" {
if let number = Int(operation[1]) {
if number == 1 {
if let maxIndex = queue.indices.max(by: { queue[$0] < queue[$1] }) {
queue.remove(at: maxIndex)
}
} else if number == -1 {
if let minIndex = queue.indices.min(by: { queue[$0] < queue[$1] }) {
queue.remove(at: minIndex)
}
}
}
}
}
구현부에 이런식으로 클로저를 이용하였고, 정렬후 삭제하는 개념이 아니라 실제로 최댓값과 최솟값을 삭제할 수 있었다.