[프로그래머스] 뒤에 있는 큰 수 찾기 | JavaScript

예구·2023년 9월 26일
0

Algorithm

목록 보기
41/47
post-thumbnail

문제 출처

1. 문제

문제 설명

정수로 이루어진 배열 numbers가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.
정수 배열 numbers가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.

제한 사항

  • 4 ≤ numbers의 길이 ≤ 1,000,000
    • 1 ≤ numbers[i] ≤ 1,000,000

입출력 예

numbersresult
[2, 3, 3, 5][3, 5, 5, -1]
[9, 1, 5, 3, 6, 2][-1, 5, 6, 6, -1, -1]

입출력 예 설명

입출력 예 #1

2의 뒷 큰수는 3입니다. 첫 번째 3의 뒷 큰수는 5입니다. 두 번째 3 또한 마찬가지입니다. 5는 뒷 큰수가 없으므로 -1입니다. 위 수들을 차례대로 배열에 담으면 [3, 5, 5, -1]이 됩니다.

입출력 예 #2

9는 뒷 큰수가 없으므로 -1입니다. 1의 뒷 큰수는 5이며, 5와 3의 뒷 큰수는 6입니다. 6과 2는 뒷 큰수가 없으므로 -1입니다. 위 수들을 차례대로 배열에 담으면 [-1, 5, 6, 6, -1, -1]이 됩니다.



2. 풀이

2.1. 시간초과 발생한 코드

처음에는 단순하게 numbers의 값을 하나씩 고정시켜두고, 뒤에 있는 값 중에 현재 값 보다 큰 값이 있다면 result 배열에 push, 없다면 -1을 push하는 방식으로 풀었다.
하지만 시간초과가 발생헀고 다른 방법을 찾아야 했다.

function solution(numbers) {
  let result = [];

  for (let i = 0; i < numbers.length; i++) {
    let val = numbers[i];
    let check = false;

    for (let j = i + 1; j < numbers.length; j++) {
      if (val < numbers[j]) {
        result.push(numbers[j]);
        check = true;
        break;
      }
    }

    if (!check) result.push(-1);
  }

  return result;
}

실행결과 이미지


2.2. 통과한 코드

시간 복잡도를 줄이기 위해 for문을 하나 줄여야 했다.
따라서 아래와 같이 수정을 했다.

  • numbers의 길이만큼 배열을 생성하여 값을 모두 -1로 채우기
  • for문을 돌며, 현재 값을 기준으로 이전 값들 중 현재 값보다 작은 값을 바꾸는 과정
    • 바뀌는 값이 현재 값이 아님!!! (이 부분을 이해하는 데 시간이 좀 걸렸다.)
  • stack을 생성하고, for문을 돌며 index 값을 push
  • for문을 돌며 stack에 값이 있고, 현재 위치 이전의 값 중 현재 값보다 작은 값이 있다면 stack에서 꺼내서 그 값을 현재 값으로 변경

전체 코드는 아래와 같다.

function solution(numbers) {
  let result = new Array(numbers.length).fill(-1)

  let stack = []
  // 현재 값을 기준으로
  // 앞에 있는 값 중에서 값이 정해지지 않고, 현재 값보다 작은 값 바꾸기
  for (let i=0; i<numbers.length; i++) {
      // 값이 변경되지 않은 인덱스가 있고, 현재 값보다 인덱스에 해당하는 값이 작은 경우
      while (stack && numbers[stack[stack.length-1]] < numbers[i]) {
          result[stack.pop()] = numbers[i]
      }
      
      // (값이 변경되지 않은) 현재 index push
      stack.push(i)
  }

  return result;
}

실행결과 이미지

정말 이런 코드를 다들 어떻게 작성하는지 모르겠다.
알고리즘 역량은 아직 경험해야 할 게 많다고 느꼈다.

profile
우당탕탕 FE 성장기

0개의 댓글