
😎풀이
nums를 순회하며 연속 등장하며, 중복되는 요소를 병합 예) [1, 3, 1, 1, 2] -> [1, 3, 1, 2]
- 병합된 요소에서 첫 요소와 마지막 요소를 제외하고 순회
2-1. 첫 요소와 마지막 요소는 이웃한 요소가 하나 뿐이므로 valley나 hill의 조건을 만족하지 못 함
2-2. 이웃한 두 요소를 초과하는 현재 요소는 hill로 처리
2-3. 이웃한 두 요소의 미만인 현재 요소는 valley로 처리
2-4. hill혹은 valley인 경우 카운트
- 계산된 카운트 반환
function countHillValley(nums: number[]): number {
const merged = mergeArr(nums)
let count = 0
for(let i = 1; i < merged.length - 1; i++) {
const prev = merged[i - 1]
const cur = merged[i]
const next = merged[i + 1]
if(isHill(prev, cur, next) || isValley(prev, cur, next)) count++
}
return count
};
function mergeArr(nums: number[]) {
const merged = []
for(let i = 1; i < nums.length; i++) {
const prev = nums[i - 1]
const cur = nums[i]
if(prev === cur) continue
merged.push(prev)
}
merged.push(nums.at(-1))
return merged
}
function isHill(prev: number, cur: number, next: number) {
if(prev >= cur) return false
if(next >= cur) return false
return true
}
function isValley(prev: number, cur: number, next: number) {
if(prev <= cur) return false
if(next <= cur) return false
return true
}