commands에서 돌 때 i == j인 경우에는 i번째 요소를 저장하고, 다른 경우에는 i부터 j까지 배열을 잘라 저장하려고 했었다.
그런데 에러가 발생하였다 🤮
i == j가 아닌 경우에 ArraySlice타입이라서 newArray에 값을 할당할 수 없다.
func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] {
var answer: [Int] = []
for command in commands {
let i = command[0]
let j = command[1]
let k = command[2]
var newArray: [Int] = []
if i == j {
newArray = array[i - 1]
} else {
newArray = array[i - 1...j - 1]
}
조건에 따라 타입이 달라진다 😱
var newArray: [Int] = []
var newArray = ArraySlice<Int>()
순간 이건 어쩌지? 하면서 당황스러웠다. 맘이 아팠지만 결국 이중포문을 사용하여 풀어보았다.
func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] {
var answer: [Int] = []
for command in commands {
let i = command[0]
let j = command[1]
let k = command[2]
var arr: [Int] = []
for n in array[i - 1...j - 1] {
arr.append(n)
}
let sortedArr = arr.sorted()
let number = sortedArr[k - 1]
answer.append(number)
}
return answer
}
포문을 굳이 또 쓰는 건 비효율적이고 생각이 강하게 들었다. 변수를 선언하고 값을 할당하지 말고 바로 선언하였다.
func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] {
var answer: [Int] = []
for command in commands {
let i = command[0]
let j = command[1]
let k = command[2]
let arr = array[i - 1...j - 1]
let sortedArr = arr.sorted()
answer.append(sortedArr[k - 1])
}
return answer
}
항상 다른 사람의 풀이를 보면서 많이 배운다. 깔끔하게 map을 사용하여 작성할 수도 있다.
func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] {
return commands.map({command in
return array[(command[0] - 1)...(command[1] - 1)].sorted()[command[2] - 1]
})
}
줄이고 줄이면 한줄로 작성할 수도 있다. 심오한 클로져의 세계 🤭
func solution(_ array:[Int], _ commands:[[Int]]) -> [Int] {
return commands.map({ array[($0[0] - 1)...($0[1] - 1)].sorted()[$0[2] - 1] })
}