CodingTest/LeetCode

[LeetCode] 941. Valid Mountain Array, Easy

뜸부깅 2025. 3. 10. 17:53
반응형

1. 문제

  • 배열 arr이 주어질 때, 다음 조건을 만족하면 true, 아니면 false를 반환.
    • 배열 길이는 3이상이어야 한다.
    • 0번 인덱스부터 특정 인덱스 기준까지 요소의 값이 상승해야 한다.
    • 특정 인덱스 기준부터 요소의 값이 하락해야 한다.

2. 해결

function validMountainArray(arr: number[]): boolean {
    if(arr.length <3) return false;
    if(arr[1] < arr[0]) return false;

    let dir: 'up'|'down' = 'up';
    let isPeached: boolean = false;
    
    for(let i = 0; i< arr.length-1; i++) {
        
        if(dir === 'up') {
            if(arr[i+1] > arr[i]) continue;
            else if(arr[i+1] < arr[i]) {
                dir = 'down';
                isPeached = true;
            } else {
                return false;
            }
        } else {
          if(arr[i+1] < arr[i]){ 
              continue; 
          } else {
              return false;
          }
        }
    }
    
    return isPeached ? true : false;
};
  • 첫 풀이다. 방향을 나타내는 dir과 특정 인덱스에 도달했는지 여부를 변수로 빼고, 배열의 처음 부터 탐색하면서 방향과 인덱스 도달 여부를 업데이트 해준다.
  • 값이 상승하는 중에 하락하거나, 하락 중에 상승하면 false를 반환하고, 그렇지 않으면 특정 인덱스 도달 여부에 따라 true, false를 반환한다.
  • 예외 케이스에 주의해야 한다.
function validMountainArray(arr: number[]): boolean {
    if(arr.length <3) return false;

    let left = 0;
    let right = arr.length - 1;

    while (left < arr.length -1 && arr[left] < arr[left + 1]) left++;

    while (right > 0 && arr[right-1] > arr[right]) right--;

    return left > 0 && right < arr.length - 1 && left === right
};
  • 투 포인터를 이용한 풀이로, 왼쪽과 오른쪽에서 값이 상승하는 여부를 확인하면서 둘이 만났을 때, Valid Mountine이 된다.
  • 처음에 투 포인터를 사용해보려고 했는데, 아직까지 익숙하지 않은 것 같다.