본문 바로가기

Study/Coding Test

[BaekJoon] 스택(JavaScript)

📘 오늘의 코딩테스트 - 스택(JavaScript)

🔢 문제 번호: 10828

🔗 문제 링크: 백준 - 스택

 

 

 

 

🧠 문제 요약

  • 정수를 저장하는 스택을 구현하여 주어지는 명령을 처리하는 문제
    • 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