백준-Node.js-1874, 스택 수열

송철진·2023년 2월 26일
0

백준-Node.js

목록 보기
40/71
post-custom-banner

풀이

const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n').map(Number)
const N = input[0]
const a = input.slice(1)

const solution = (N, a) => {
  let stack = []
  let result = ''
  let j = 0
  for(let i = 1; i <= N; i++){
    stack.push(i)
    result += '\n+'
    while(stack[stack.length-1] === a[j]){
      stack.pop()
      result += '\n-'
      j++
      if(j === N) break;
    }
  } 
  
  return stack.length === 0 ? result.slice(1) : 'NO'
}

console.log(solution(N, a))

배열 stack에 1부터 N까지의 숫자를 차례로 push()할 때마다
stack의 마지막 값과 입력값 a의 값을 비교하여 같으면 pop() 한다.

비교하려는 a의 값이 마지막 값이면 stack[stack.length-1]a[j]가 둘다 undefined가 되어 while() 조건식이 true가 되므로 break조건을 추가했다.

최종적으로 stack의 길이가 0이면 목표하는 스택 수열을 만든 것이므로
result의 첫 문자\n를 slice(1) 으로 처리하여 반환한다.
0이 아니면 스택 수열을 만들지 못한 것이므로 'NO'를 반환한다.

### N: 8
### a: [4,3,6,8,7,5,2,1]

### stack			   result
[ 1 ] 				// +
[ 1, 2 ] 			// + +
[ 1, 2, 3 ] 		// + + +
[ 1, 2, 3, 4 ] 		// + + + +
[ 1, 2, 3 ] 		// + + + + -
[ 1, 2 ] 			// + + + + - -
[ 1, 2, 5 ] 		// + + + + - - +
[ 1, 2, 5, 6 ]		// + + + + - - +
[ 1, 2, 5 ]			// + + + + - - + -
[ 1, 2, 5, 7 ]		// + + + + - - + - +
[ 1, 2, 5, 7, 8 ]	// + + + + - - + - + +
[ 1, 2, 5, 7 ]		// + + + + - - + - + + -
[ 1, 2, 5 ]			// + + + + - - + - + + - -
[ 1, 2 ]			// + + + + - - + - + + - - - 
[ 1 ]				// + + + + - - + - + + - - - -
[]					// + + + + - - + - + + - - - - -
profile
검색하고 기록하며 학습하는 백엔드 개발자
post-custom-banner

0개의 댓글