반응형
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이 된다.
- 처음에 투 포인터를 사용해보려고 했는데, 아직까지 익숙하지 않은 것 같다.