ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 10828 스택 [C]
    알고리즘 2023. 1. 7. 15:42

    이번 게시물에서는 자료구조 스택에 대하여 학습해 본 이후에 C++ STL을 통하여 백준 10828 스택 문제까지 풀여보려 합니다.

    스택?

    * 스택을 떠올리면, 가장 쉽게 떠올릴 수 있는 이미지가 컵입니다.
    * 예를 들어, 동전 1개만 들어갈 수 있는 입구를 가진 컵에 빨간 동전, 초록 동전, 파랑 동전을 순서대로 넣었다고 가정해봅시다.
    * 이때 컵을 기울여 동전을 꺼낸다고 가정을 하면 파랑 동전, 초록 동전, 빨강 동전 순서대로 다시 나오게 됩니다.
    * 위와 같이, 스택은 가장 나중에 삽입한 원소를 가장 나중에 꺼낼 수 있는 LIFO(Last-In First-Out) 자료구조라고 생각해주시면 됩니다.

    STL?

    Standard Template Library 의 약자이며, 사용자가 자료구조와 알고리즘을 직접 모두 구현하지 않아도 편리하게 사용할 수 있는 라이브러리라 생각해주시면 됩니다.

    STL - Stack

    STL Stack을 사용하기 위해서는 헤더파일을 선언해주어야 합니다.

    #include<stack>
    using namespace std;

    using namespace std; 이것은 나중에 stack을 선언할때마다 std::를 붙이지 않고 선언할 수 있도록 도와줍니다. 이제 헤더파일을 선언했으면, Stack을 만들어줍시다. 

    stack<int> S;

    정수형만을 담을 수 있는 스택을 만들어보았습니다. 다른 데이터 타입을 넣고 싶은 경우에는 <>안에 해당 데이터타입을 넣어주시면 됩니다.

    Stack에는 크게 5가지 연산이 있습니다. 하나씩 살펴보도록 합시다.

    원소를 삽입하는 push입니다.

    S.push(3);

    스택에 3이라는 정수형 데이터를 삽입하였습니다.

    다음에는 스택의 맨 위에 있는 원소를 삭제하는 pop입니다.

    S.pop();

     

    스택에 들어있는 원소의 갯수를 리턴해주는 size입니다.

    printf("%d", S.size());

    위와 같은 코드로 해당 스택의 원소의 갯수를 출력할 수 있습니다.

    다음은, 스택이 비어있는지 여부를 판단하는 empty입니다. 스택이 비어있다면 1이 리턴이 됩니다.

    S.size()가 0인지 비교로도 구할 수 있습니다.

    if(S.empty()) {
    	// 스택이 비어있을 때 실행되는 구문
    }

    마지막으로, 스택의 가장 위에 있는 원소를 리턴하는 top입니다.

    printf("%d", S.top());

    위 5가지 연산을 이용하여 백준 10828번 문제를 풀어보도록 하겠습니다.

     

    문제

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

     

    10828번: 스택

    첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

    www.acmicpc.net

    코드

    #include<stdio.h>
    #include<stack>
    #include<string.h>
    using namespace std;
    int N;
    stack<int> st;
    
    char str[10];
    int main()
    {
        int a;
        scanf("%d",&N);
        for(int ii=0;ii<N;ii++){
            scanf("\n%s",str);
            if(strcmp(str,"push")==0){
                scanf(" %d",&a);
                st.push(a);
            }
            if(strcmp(str,"top")==0){
                if(st.empty()){
                    printf("-1\n");
                }else {
                    printf("%d\n",st.top());
                }
            }
            if(strcmp(str,"empty")==0){
                printf("%d\n",st.empty() ? 1 : 0);
            }
            if(strcmp(str,"size")==0){
                printf("%d\n",st.size());
            }
            if(strcmp(str,"pop")==0){
                if(st.empty()){
                    printf("-1\n");
                } else {
                    printf("%d\n",st.top());
                    st.pop();
                }
            }
        }
        return 0;
    }

    '알고리즘' 카테고리의 다른 글

    백준 20652 Stuck in a Rut [C]  (0) 2023.01.07
    백준 20651 Daisy Chains [C]  (0) 2023.01.07
    백준 20650 Do You Know Your ABCs? [C]  (0) 2023.01.07
    백준 9012 괄호 [C]  (0) 2023.01.07
    백준 10773 제로 [C]  (0) 2023.01.07

    댓글

Designed by Tistory.