[LeetCode] Valid Mountain Array

준규·2022년 11월 6일
0

정수 배열 arr가 주어질 때 arr 가 mountain array이면 true를 리턴하는 문제이다.

mountain array의 정의는 다음과 같다.

  • arr의 길이는 3이상이다.
  • 특정 i인덱스의 값을 기준으로 다음이 성립한다.

1 . arr[0] < arr[1] ... < arr[i - 1] < arr[i]

2 . arr[i] > arr[i+1] > ... > arr[arr.length - 1]

Example을 보자

1번 예시와 같이 arr의 길이가 3보다 작으면 무조건 false가 리턴된다.

const validMountainArray = function (arr) {
  if (arr.length < 3) return false;

  const maximum = Math.max(...arr);

  const index = arr.indexOf(maximum);

  const first = arr.slice(0, index + 1);
  const second = arr.slice(index);

  const set1 = new Set([...first]);
  const set2 = new Set([...second]);

  if (first.length !== [...set1].length || second.length !== [...set2].length)
    return false;

  if (first.length === 1 || second.length === 1) return false;

  const tempFirst = [...first];
  const tempSecond = [...second];

  tempFirst.sort((a, b) => a - b);

  tempSecond.sort((a, b) => b - a);

  return JSON.stringify(first) === JSON.stringify(tempFirst) &&
    JSON.stringify(second) === JSON.stringify(tempSecond)
    ? true
    : false;
};

먼저 arr의 길이가 3보다 작은경우는 예외처리를 해주고 arr의 꼭대기 값을 구하기로 했다.

꼭대기 값은 arr 배열 요소들 중 최댓값이므로 Math.max 메소드를 사용하여 최댓값을 구해준 뒤, 최댓값의 인덱스를 기준으로 앞쪽과 뒷쪽으로 배열을 나누었다.

만약 이렇게 나눈 앞쪽 배열과 뒷쪽 배열의 요소들 중 중복값이 존재하면 mountain array가 아니므로 set을 활용하여 중복된 요소가 있다면 false를 리턴해주었다.

그 후 앞쪽배열은 오름차순, 뒷쪽 배열은 내림차순이 되어야 하므로 얕은 복사를 하여 temp 변수들을 오름차순 , 내림차순으로 정렬을 해주고

원본 부분 배열들과 각각을 비교하여 한쪽이라도 다르면 false를 리턴해주었다.

submit을 해보니

정답이었다!

profile
안녕하세요 :)

0개의 댓글