🔴 문제
🔵 풀이
몇 번의 시행착오를 거치고 나서야 문제를 풀 수 있었다.
▶️ 시행착오
1. 오름차순 정렬 후 removeFirst()를 하면 오류가 난다.
가장 작은 값을 삭제하기만 해야하는데 배열을 정렬시켜버리니 원래 배열과 달라져 오류가 났다.
🔽 오류가 발생하는 코드
func solution(_ arr:[Int]) -> [Int] {
var result = arr.sorted
result.removeFirst()
return result == [] ? [-1] : result
}
따라서, 오름차순으로 정렬하는 대신,
- arr 에서 최솟값을 찾고 => min()
- 최솟값의 인덱스 위치를 찾아서 => firstIndex(of:)
- 그 위치에 있는 값을 삭제 => remove(at:)
하는 프로세스로 전환했다.
그러나... 또 문제가 발생했는데...
2. 배열.remove(at:인덱스 번호) 를 return하면 오류가 난다.
🔽 오류가 발생하는 코드, 오류 메시지: "Cannot convert return expression of type 'Int' to return type '[Int]'"
func solution(_ arr:[Int]) -> [Int] {
var result = arr
return result.count == 1 ? [-1] : result.remove(at: result.firstIndex(of: arr.min()))
}
오류 원인: remove(at:)은 배열 자체에서 인덱스를 삭제하고 삭제한 값을 반환하기 때문에, 위 코드는 오류가 난다.
아래 예제에서 arr 자체가 수정되는 것을 확인할 수 있으며,
rest에 저장한 remove의 리턴값은 remove로 삭제된 값임을 확인할 수 있다.
// remove 예제
var arr1 = [1,2,3,4,5]
let rest1 = arr1.removeFirst()
print("rest1: \(rest1), arr1: \(arr1)") // rest1: 1, arr1: [2, 3, 4, 5]
var arr2 = [1,2,3,4,5]
let rest2 = arr2.remove(at: 2)
print("rest2: \(rest2), arr2: \(arr2)") // rest2: 3, arr2: [1, 2, 4, 5]
이 오류를 해결하고자, remove(at:)을 바로 리턴하는 대신,
그 다음 줄에서 result 변수를 반환하는 방식을 시도했다.
=>
func solution(_ arr:[Int]) -> [Int] {
var result = arr
result.count == 1 ? [-1] : result.remove(at: result.firstIndex(of: arr.min()))
return result
}
3. .min()과 firstIndex(of:) 부분에서 또 오류 발생...
.min()과 .firstIndex(of:)는 옵셔널 타입이 반환된다. 따라서 옵셔널을 강제적으로 제거하는 '!'을 추가해야 오류가 사라진다.
수정 => result.remove(at: result.firstIndex(of: arr.min()!)!)
▶️ 최종 코드
위의 시행착오를 거쳐 최종적으로 산출한 코드는 다음과 같다.
func solution(_ arr:[Int]) -> [Int] {
var result = arr
result.remove(at: result.firstIndex(of: arr.min()!)!)
return result == [] ? [-1] : result
}
print(solution([4,3,2,1])) // [4,3,2]
print(solution([3,7,9,5])) // [7,9,5]