문제의 본질은 감소하지 않는 배열을 구하는 것 입니다.
A, B
두 배열의 원소 사이라고 생각해 봅시다. (두 사이의 index를 idx 라고 생각합시다!, 즉 A의 index가 idx가 되겠습니다.)A
를 선택해서 변경할 경우, B
는 A
이전에 나온 수 보다는 크거나 같아야 합니다.B
를 선택해서 변경할 경우, A
는 B
다음에 나올 수보다 작거나 같아야 합니다.수식으로 표현해보면 다음 과 같게 됩니다.
import Foundation
class Solution {
let INF = 10000
func checkPossibility(_ nums: [Int]) -> Bool {
if nums.count <= 1 { return true }
var nums = [-INF] + nums, idx = -1
nums.append(INF)
let limit = nums.count - 1
for i in 1..<limit {
if nums[i] > nums[i + 1] {
if idx != -1 { return false }
idx = i
}
}
if idx == -1 { return true }
return (nums[idx] <= nums[idx + 2]) || (nums[idx - 1] <= nums[idx + 1])
}
}
간단한 배열 문제였습니다.
생각할 것이 그리 많지는 않았습니다.