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
반응형
'코딩테스트(JavaScript) > 자료구조' 카테고리의 다른 글
백준- 10845번(큐) / 자바스크립트 (2) | 2023.10.01 |
---|---|
백준- 10828번(스택) / 자바스크립트 (0) | 2023.10.01 |