코딩테스트(JavaScript)/자료구조

백준-1847번(스택 수열) / 자바스크립트

paintover23 2023. 10. 1. 18:18
728x90

문제 링크: https://www.acmicpc.net/problem/1874

const fs = require('fs');
const input = fs
  .readFileSync('example.txt') // 제출시: '/dev/stdin'
  .toString()
  .trim()
  .split('\n')
  .map((el) => Number(el));

function stackSequence() {
  const n = input[0]; // 8
  const arr = input.slice(1);
  // [4,3,6,8,7,5,2,1] n을 제ㅁ외한 나머지 목록(마지막 index 지정 안하면 끝까지 지정됨)
  // 이 숫자와 일치하게 수열을 만들고 완료하면 스택에서 제거, push 할때는 오름차순으로 넣기

  let stack = [];
  let result = [];
  let stackNum = 1;

  for (let i = 0; i < n; i++) {
    let num = arr[i]; // 배열에서 특정 요소

    while (stackNum <= num) {
      stack.push(stackNum++); // 이렇게 되면 스택에는 [1,2,3,4] 가 쌓인다
      result.push('+'); // [+,+,+,+] 가 쌓인다
    }

    if (stack[stack.length - 1] === num) {
      // 원하는 수열까지 스택에 쌓이면
      stack.pop(); // 스택에서 꺼낸다
      result.push('-'); // 꺼냄의 의미로 result 배열에 '-'를 찍는다.
    } else {
      console.log('NO'); // 이외의 경우는 모두 no를 출력한다.
      return;
      // NO 다음에 console이 또 있기 때문에 "출력 초과" 오류가 생긴다.
      // 이를 방지하기 위해 return으로 실행을 종료한다.
    }
  }
  console.log(result.join('\n'));
}

stackSequence();

풀이 포인트 및 배운점

1. slice 메소드:

    - 원본 배열을 복사할 때 유용하다

    - input : [8,4,3,6,8,7,5,2,1] 일 때,

    - const arr =input.slice(1)는 input의 1번 인덱스 부터 마지막 인덱스까지를 잘라낸다. (인자로 두개를 전달하며(각각 시작 인덱스, 종료 인덱스를 의미) 종료 인덱스를 생략하면 맨 끝의 인덱스 까지를 복사한다) 즉 [4,3,6,8,7,5,2,1] 가 된다.

 

2. return 을 통해 출력 초과 오류 방지:

    - NO 다음에 console.log(result.join('\n'))의 console이 또 있기 때문에 "출력 초과" 오류가 생긴다. 이를 방지하기 위해 return으로 조건을 만족하면 다음 코드를 실행하지 않도록 실행을 종료한다.

728x90
반응형