🧠 문제 요약
- 정수를 저장하는 스택을 구현하여 주어지는 명령을 처리하는 문제
- push X: 정수 X를 스택에 넣기
- pop: 스택에서 가장 위 정수를 빼고 출력 (없으면 -1)
- size: 스택에 들어있는 정수의 개수 출력
- empty: 스택이 비어있으면 1, 아니면 0 출력
- top: 스택 가장 위 정수 출력 (없으면 -1)
- 입력: 첫째 줄에 명령 수 N, 둘째 줄부터 N개의 명령
- 출력: 출력 명령이 주어질 때마다 한 줄에 하나씩 출력
✅ 실행 예시 및 결과
입력:
7
pop
top
push 123
top
pop
top
pop
출력:
-1
-1
123
123
-1
-1
✍️ 내 풀이
- 구조 분해 할당으로 명령어들만 추출
- 배열을 스택으로 활용
- switch문으로 각 명령어별 처리
💻 내가 푼 코드
// 입력 처리: utf8 인코딩으로 빠르게 읽어서 줄 단위로 분리
const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n');
// 구조 분해 할당: 첫 번째 줄은 N(사용 안 함), 나머지는 명령어들
const [N, ...commands] = input;
// 스택 역할을 할 배열 초기화
let stack = [];
// 각 명령어 순회
for(let command of commands) {
// 명령어를 공백으로 분리 (예: "push 1" → ["push", "1"])
let parts = command.split(' ');
// 명령어 종류별로 분기 처리
switch(parts[0]) {
case 'pop':
// 스택이 비어있으면 -1, 아니면 맨 위 원소 제거 후 출력
if(stack.length === 0) {
console.log(-1);
} else {
console.log(stack.pop());
}
break;
case 'size':
// 스택에 들어있는 원소의 개수 출력
console.log(stack.length);
break;
case 'empty':
// 스택이 비어있으면 1, 아니면 0 출력
stack.length === 0 ? console.log(1) : console.log(0);
break;
case 'top':
// 스택이 비어있으면 -1, 아니면 맨 위 원소 출력 (제거 안 함)
stack.length === 0 ? console.log(-1) : console.log(stack[stack.length - 1]);
break;
case 'push':
// parts[1]을 스택에 추가 (문자열로 저장됨)
stack.push(parts[1]);
break;
}
}
📎 남이 푼 코드
const input = require('fs').readFileSync(0, 'utf8').trim().split('\n');
const n = +input[0];
const stack = [];
let result = [];
for(let i = 1; i <= n; i++) {
const cmd = input[i].split(' ');
if(cmd[0] === 'push') {
stack.push(+cmd[1]);
} else if(cmd[0] === 'pop') {
result.push(stack.length ? stack.pop() : -1);
} else if(cmd[0] === 'size') {
result.push(stack.length);
} else if(cmd[0] === 'empty') {
result.push(stack.length ? 0 : 1);
} else if(cmd[0] === 'top') {
result.push(stack.length ? stack[stack.length-1] : -1);
}
}
console.log(result.join('\n'));
- 출력을 배열에 모아서 마지막에 한 번에 출력하는 방식
- 메모리는 더 사용하지만 출력 최적화 굳
🔍 회고 & 배운 점
- 처음에 시도했을 때 시간초과가 떴......;;;
- 맨 첫 줄 input 부분에서 utf8 인코딩을 사용했더니 통과!!
- 이제부턴 const input = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n'); 이렇게 쓰는 걸로!!
- 스택의 LIFO(Last In First Out) 특성을 배열로 구현하는 학습!!
- 여러가지 조건 처리는 switch문이 가독성이 좋은 것 같다
반응형
'Study > Coding Test' 카테고리의 다른 글
[BaekJoon] 요세푸스 문제 0(JavaScript) (4) | 2025.08.28 |
---|---|
[BaekJoon] 큐(JavaScript) (3) | 2025.08.27 |
[BaekJoon] 숫자 카드2(JavaScript) (1) | 2025.08.25 |
[baekjoon] 괄호(JavaScript) (0) | 2025.08.23 |
[baekjoon] 카드2(JavaScript) (1) | 2025.08.22 |