본문 바로가기
코딩테스트/백준

백준 10828 (스택): 스택 ...나의 삽질과 고군분투

by YUYU_ 2022. 10. 18.

계속 출력은 맞았는데 채점만 하면 틀렸다는 결과만 나왔다. 계속 이것저것 시도했는데 나의 실패 원인은 아래와 같을 것이라고 생각한다. 

//

실패의 원인 1. 입출력을 잘못 이해했다. 

나는 예제 입력/출력 만 보고 한꺼번에 입력을 받고 한꺼번에 출력을 해야 하는 줄 알았다. 

push 를 입력받는 부분도, push 4 와 같이 숫자와 함께 입력받은 후 정성스럽게 잘라주는 작업까지... (뻘짓이었다.)

실패의 원인 2. 배열의 사이즈

를 무시하고 당당하게 스택의 size 를 100으로 define 하였다.  엄청난 뻘짓이다. 

지금 다시 아래의 틀린 코드를 보니 INPUT을 10000 으로 디파인 해 놓고 ... 난 바보다. 

계속 코드를 수정하면서 제출->실패->제출->실패 를 겪었다...

 

실패 원인 3. 값을 출력해서 눈으로 확인하려고 했던 테스트 코드를 안 지웠다.

실패의 원인 4. size 함수

top이 -1 일 때 0을 출력하도록 했는데, 이렇게 말고 empty 함수를 사용해서 해당 스택이 비어있는지 검사하고 비어있다면 0을 출력하도록 했다. 

 

이것 말고도 기억이 나지 않은 실패의 원인들이 있을 수 있긴 한데, 일단 생각나는 만큼만 적어 보았다. 

 

정답으로 다음과 같이 제출하였다. 

#include <iostream>
#include <string>
#define SIZE 10000
#define INPUT 10000
using namespace std;

struct  stack{
    int top=-1;
    int arr[SIZE];
};
void push(struct stack *S, int n){
    if(S->top==SIZE-1){

    }else {
        int top;
        S->top +=1;
        top = S->top;
        S->arr[top] = n;
    }
}

int pop(struct stack *S){
    if(S->top==-1){
        return -1;
    }else {
        int temp;
        int top = S->top;
        temp = S->arr[top];
        S->top = S->top -1;
        return temp;
    }
}

int empty(struct stack *S){
    if(S->top == -1) return 1;
    else return 0;
}

int top(struct stack *S){
    int re;
    if (empty(S)==1){
        re=-1;
    }
    else if(empty(S)==0){
        int temp;
        int top=S->top;
        temp = S->arr[top];
        re= temp;
    }
    return re;
    
}

int size(struct stack *S){
    
    if (empty(S)==1){return 0;}
    else return S->top+1;
}
int main()
{
    ios_base::sync_with_stdio(false);
    struct stack S;
    string input;
    //char ch_input[INPUT];
    int int_input;
    int i,n;
    cin>>int_input;
    //cin.ignore();
    for(i=0;i<int_input;i++){
        //getline(cin,input);
        cin>>input;
        //cin.ignore();
        if(input == "push"){
            cin >> n;
            
            push(&S,n);
            //cin.ignore();
        }
        else if(input.compare("top") == 0){
            cout<<top(&S)<<endl;
        }else if(input.compare("pop")==0){
            cout<<pop(&S)<<endl;
        }else if(input.compare("size")==0){
            cout<<size(&S)<<endl;
        }else if(input.compare("empty")==0){
            cout<<empty(&S)<<endl;
        }
    }
    

    return 0;
}