[LeetCode] 2210. Count Hills and Valleys in an Array

Chobby·3일 전
1

LeetCode

목록 보기
688/710

😎풀이

  1. nums를 순회하며 연속 등장하며, 중복되는 요소를 병합 예) [1, 3, 1, 1, 2] -> [1, 3, 1, 2]
  2. 병합된 요소에서 첫 요소와 마지막 요소를 제외하고 순회
    2-1. 첫 요소와 마지막 요소는 이웃한 요소가 하나 뿐이므로 valleyhill의 조건을 만족하지 못 함
    2-2. 이웃한 두 요소를 초과하는 현재 요소는 hill로 처리
    2-3. 이웃한 두 요소의 미만인 현재 요소는 valley로 처리
    2-4. hill혹은 valley인 경우 카운트
  3. 계산된 카운트 반환
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
}
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글