매일 BOJ

(매일 BOJ) C++ 10828번 스택

norepinephrine 2025. 7. 10. 00:21

이번 문제는 실버 4 난이도 10828번 스택 문제이다.

https://www.acmicpc.net/problem/10828

 

이 문제의 접근법부터 알아보자.

이 문제는 표준 입력으로 주어지는 명령어에 따라 스택에 값을 넣거나(push), 맨 위 값을 빼거나(pop), 현재 스택의 크기(size), 스택이 비었는지(empty), 맨 위 값(top)을 조회하는 기능을 차례대로 수행하고, 각 명령의 결과를 요구하는 대로 즉시 출력하는 구현 문제이기에 스택이 비어 있을 때 pop이나 top 명령이 들어오면 -1을 출력해야 하며, 나머지 연산은 스택 자료구조의 기본 동작에 맞게 처리하면 된다.

 

따라서 C++  라이브러리 중 stack 라이브러리를 사용하여 구현하면 해결되는 간단한 구현 문제이다.

 

여기서 나오는 스택에 대해 알아보자

 

스택(stack)

스택(stack)은 후입선출(LIFO, Last-In First-Out) 방식으로 동작하는 자료구조
즉, 가장 나중에 넣은 데이터가 가장 먼저 나오는 구조다.

주요 특징

  • 한쪽 끝(맨 위, top)에서만 데이터의 추가(push)와 제거(pop)가 일어남
  • 맨 위(top) 원소만 접근 가능
  • 구조상 삽입/삭제가 빠름 시간복잡도(O(1))

주요 연산

  • push(x): x를 스택의 맨 위에 추가
  • pop(): 맨 위의 원소를 제거
  • top(): 맨 위의 원소를 확인(제거는 안 함)
  • size(): 스택의 원소 개수 반환
  • empty(): 스택이 비었는지 확인

큐와 스택의 차이점 정리

                                 스택(Stack)                                                     큐(Queue)

 

구조 후입선출(LIFO) 선입선출(FIFO)
삽입 위치 top(맨 위) back(맨 뒤)
삭제 위치 top(맨 위) front(맨 앞)
주요 함수 push, pop, top, empty push, pop, front, back, empty
비유 접시 쌓기 줄서기(은행, 버스 등)
응용 예시 되돌리기, 괄호검사 프린터 대기열, BFS
 

핵심 요약

  • 스택(Stack) :
    마지막에 넣은 데이터가 가장 먼저 나온다.
    (책 더미, 웹 브라우저 뒤로가기, undo 기능 등)
  • 큐(Queue) :
    먼저 넣은 데이터가 가장 먼저 나온다.
    (놀이공원 입장 줄, 콜센터 대기, BFS 등)

 

아래는 이 문제를 해결하기 위해 작성한 코드이다.

 

#include <bits/stdc++.h>
using namespace std;

int main (void){
    ios::sync_with_stdio(0); cin.tie(0);
    int N;
    cin >> N;
    stack<int> s;
    for (int i = 0; i < N; i++){
        string str;
        cin >> str;
        if (str == "push"){
            int X;
            cin >> X;
            s.push(X);
        }

        else if (str == "pop"){
            if (s.size() == 0) cout << -1 << '\n';
            else{
            cout << s.top() << '\n';
            s.pop();
            }   
        }

        else if (str == "size"){
            cout << s.size() << '\n';
        }

        else if (str == "empty"){
            cout << s.empty() << '\n';
        }
        else if (str == "top"){
            if (s.size() == 0) cout << -1 << '\n';
            else cout << s.top() << '\n';
        }
    }
    return 0;
}