스택은 "쌓다"라는 의미로, 데이터를 차곡차곡 쌓아 올린 형태의 자료구조이다.
컴퓨터에서 아주 많이 사용되는 자료구조이며 스마트폰의 '뒤로가기'를 눌렀을 때 현재 수행되는 앱이 종료되고 바로 직전에 수행되던 앱이 나타나는 게 바로 스택이다.
스택의 가장 큰 특징은 후입선출(LIFO)이다.
이는 가장 최근에 들어온 데이터가 가장 먼저 나간다는 의미를 가진다.
다음 그림과 같이 1번을 넣고 2번을 넣는다면 가장 먼저 나가는 것은 2번이된다.
참고로 큐는 이와 반대된다.
원리도 중요하지만 그보다 중요한 것은 이와 같은 원리를 직접적으로 적용해보는 거라고 생각한다.
마침 Baekjoon에 스택의 원리를 적용할만한 좋은 문제가 있었다! (28278번)
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성
※ 이 글을 보시는 여러분 붉은색 숫자를 무시하지 마세요 😥
숫자는 명령어와 동일한 역할을 합니다..
저거 실수인줄 알고 무시했다가 30분동안 문제의 입출력 이해를 못했어요.
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const N = Number(input[0]);
let stack = [];
let result = [];
for (let i = 1; i <= N; i++) {
let [num, value] = input[i].split(" ");
switch (num) {
case "1":
stack.push(Number(value));
break;
case "2":
if (stack.length > 0) {
result.push(stack.pop());
} else {
result.push(-1);
}
break;
case "3":
result.push(stack.length);
break;
case "4":
result.push(stack.length === 0 ? 1 : 0);
break;
case "5":
if (stack.length > 0) {
result.push(stack[stack.length - 1]);
} else {
result.push(-1);
}
break;
default:
break;
}
}
console.log(result.join("\n"));