1 minute read

문제

백준 10828



풀이

STL 이용한 풀이


#include <iostream>
#include <stack>
#include <string>
using namespace std;

int main(){
    stack<int> st;
    int N;
    int p;
    string input;

    cin>>N;
    for(int i; i<N; i++){
        cin>>input;
        if(input == "push"){
            cin>>p;
            st.push(p);
        }
        else if(input == "pop"){
            if(st.empty()){
                cout<<"-1"<<endl;
            }else{
                cout<<st.top()<<endl;
                st.pop();
            }
        }
        else if(input == "size"){
            cout<<st.size()<<endl;
        }
        else if(input == "empty"){
            if(st.empty()){
                cout<<"1"<<endl;
            }else{
                cout<<"0"<<endl;
            }
        }
        else if(input == "top"){
            if(st.empty()){
                cout<<"-1"<<endl;
            }else{
                cout<<st.top()<<endl;
            }
        }

    }
    return 0;



스택을 직접 구현한 풀이


#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

const int  MAX_STACK_SIZE=10000;

class ArrayStack{
    int T;
    int array[MAX_STACK_SIZE];

public:
    ArrayStack(){T =-1;}
    ~ArrayStack(){}

    void push(int N){
        if(T != MAX_STACK_SIZE-1){
            T++;
            array[T] = N;
        }
    }
    void pop(){
        if(T == -1){
            printf("-1\n");
        }else{
            printf("%d\n",array[T--]);
        }
    }
    void size(){
        printf("%d\n",T+1);
    }
    void empty(){
        if( T == -1 ){printf("1\n");}
        else{printf("0\n");}
    }
    void top(){
        if( T == -1 ){printf("-1\n");}
        else{
        printf("%d\n",array[T]);}
    }
};

int main(){
    int N;//명령의 수
    string input;//명령어
    int p; //push할 때  넣는 숫자
    ArrayStack stack;

    cin>>N;
    for(int i=0;i<N;i++){
        cin >> input;
        if(input == "push"){
            cin>>p;
            stack.push(p);
        }
        else if(input == "pop"){
            stack.pop();
        }
        else if(input == "size"){
            stack.size();
        }
        else if(input == "empty"){
            stack.empty();
        }
        else if(input == "top"){
            stack.top();
        }
    }
    return 0;
}

처음에 예제 문제는 정답으로 출력이 되는데 왜 틀렸는지 이유를 몰랐었다.
틀린 이유는 주어진 명령의 수가 1<=N<=10000 이면 최악의 경우를 고려해 스택 사이즈를 10000으로 만들어야 하는데 그 생각을 못하고 임의로 스택 사이즈를 20으로 고정시켜서 틀린것이었다.
다음에는 조건을 더 유심히 보고 예제뿐만 아니라 여러 상황을 고려해서 코드를 짜야겠다.



참고) STL Stack 기본 사용법

  • 스택 헤더 파일

stack STL을 사용하기 위해서는 #include < stack > 헤더파일을 포함해야 한다.
stack < 데이터 타입 > 이름; 으로 스택을 선언한다.

#include <stack>
  
stack<int> stack;
  • 스택에 데이터 추가하기

스택이름.push(데이터) 형태로 데이터를 추가한다.

stack.push(element)
  • 스택에 데이터 삭제하기

스택이름.pop(데이터) 형태로 스택의 top 데이터를 삭제한다.

stack.pop()
  • 스택의 제일 위(탑, top) 데이터 반환

스택이름.top() 형태로 제일 최상위 데이터를 반환한다.

stack.top()
  • 스택의 사이즈 반환

스택이름. size() 형태로 스택의 현재 사이즈를 반환한다.

stack.size()
  • 스택이 비어있는 지 확인

스택이름.empty() 형태로 스택이 비어있는지 확인한다.

stack.empty()
  • 스택 SWAP : 두 스택의 내용 바꾸기

스택1과 스택2 두 스택의 내용을 바꾸고 싶은 경우, 내장된 swap 함수를 사용한다.

swap(스택1 이름, 스택2 이름) 형태로 두 스택의 내용을 바꾼다.

swap(stack1 , stack2)

Leave a comment