Google 태그 관리자 아이콘

알고리즘 풀이

.leetcode(941. Valid Mountain Array)

silvergoni 2022. 4. 23. 09:55
반응형

https://leetcode.com/problems/valid-mountain-array/

 

1. 2022/04/23 시도

소요시간: 11분

class Solution {
    public boolean validMountainArray(int[] arr) {
        if (arr.length < 3) {
            return false;
        }
        
        boolean isIncreasing = arr[0] < arr[1];
        int prev = -1;
        for (int each: arr) {
            if (prev == each) {
                return false;
            }
            
            if (isIncreasing) {
                if (prev > each) {
                    isIncreasing = false;
                } 
            } else {
                if (prev < each) {
                    return false;
                }
            }
            
            prev = each;
        }
        
        if (isIncreasing) {
            return false;
        }
        
        return true;
    }
}

풀이 접근 과정

edge케이스를 생각해보면 3개 미만의 array길이로는 산모양을 만들 수 없으므로 return false처리를 한다.

그리고 처음부터 increasing인지를 체크한다.

prev를 저장함으로써 현재값과 이전값을 비교한다.
- 만약 값이 같으면 이건 조건에 맞지 않으므로 무조건 종료한다.
- 만약 오름세라면 줄어들때를 피크라고 보고 내림세로 바꿔준다.
- 내림세에서는 다시 오름세로 가면 return false로 설정한다.

만약에 전체가 끝났는데도 오름세라면 그건  산으로 볼 수 없으니 false리턴 처리해준다.

모든 케이스가 끝나면 true를 리턴한다.

 

느낀점

  • 오름세, 내림세를 판단하는걸 간단하게 하고 싶었는데 그걸 간단하게는 못해서 풀면서도 아쉬웠다.
  • 처음부터 edge케이스를 조금 더 생각하면 좋았겠다.
  • 솔루션에는 센스가 돋보인다. 길이라는 값을 이용해서 풀고 edge케이스 처리도 돋보인다.
class Solution {
    public boolean validMountainArray(int[] arr) {
        int N = arr.length;
        int i = 0;
        
        while (i < N-1 && arr[i] < arr[i+1]) {
            i++;
        }
        
        if ( i==0 || i== N-1) { 
            return false;
        }
        
        while (i < N-1 && arr[i] > arr[i+1]) {
            i++;
        }
        
        return i == N-1;
    }
}

알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)

반응형