ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Baekjoon_10828_스택
    Algorithm/_Baekjoon 2023. 5. 14. 18:39

    일단, 기초부터 천천히 풀어볼 것이며 첫 번째로 주어진 문제인 스택에 대해 풀어보기로 합시다.

    문제 주소: https://www.acmicpc.net/problem/10828

     

    10828번: 스택

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

    www.acmicpc.net

     

    스택문제는 다음과 같습니다.

    첫 문제답게 간단하며, 입력을 몇번할지 정한 후 주어진 명령을 통해 출력을 받는 프로그램 입니다.

    저는 이 문제를 for문과 if문으로 표현을 했습니다.

    코드는 다음과 같습니다.

     

    Python

    코드를 보기 쉽게 주석으로 설명을 달았습니다.

    import sys
    repeat_num = int(sys.stdin.readline()) # 입력값을 정수형태로 받습니다.
    append_list = [] # 빈 list를 하나 만듭니다.
    
    for i in range(repeat_num): # 받은 입력값 만큼 반복을 진행함.
        num = sys.stdin.readline().split() # 명령어와 값을 받습니다. 띄어쓰기로 입력값을 나눕니다.
    
        if num[0] == 'push':
            append_list.append(num[1]) # 만들어 놓은 빈 list에 값을 추가합니다.
    
        elif num[0] == 'pop':
                print(append_list.pop() if append_list else -1) # 가장 위의 정수를 빼고, 없다면 -1을 출력합니다.
    
        elif num[0] == 'size':
            print(len(append_list)) # list의 갯수를 출력합니다.
    
        elif num[0] == 'empty':
            if len(append_list) == 0: # list가 비어있으면 1, 아니면 0을 출력합니다.
                print('1')
            else:
                print('0')
    
        elif num[0] == 'top':
            if len(append_list) == 0: # 스택의 가장 위의 정수를 출력하며, 없다면 -1을 출력합니다.
                print('-1')
            else:
                print(append_list[-1])

    크게 특별한점이 없는 코드이지만, 제가 위에서 입력값을 받을 때, 'input()' 이 아닌 'sys.stdin.readline()'을 사용한 것을 볼 수 있습니다.

    간단하게 보자면, Input()의 경우 prompt message를 출력하고 개행 문자를 삭제한 값을 리턴하기 때문에 느리지만, sys.stdin.readline()의 경우 위와 같은 일을 하지 않기 때문에 코드를 조금 더 빠르게 할 수 있습니다.

    이는 앞으로 Baekjoon에서 코딩테스트 공부를 하실 때, 많이 사용이 될 것입니다.

     

    C++

    c++은 세 가지 방법을 사용해서 풀었습니다.

    1. vector

    // using vector
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        int n_repeat;
        vector<int> my_vector;
        string value_input;
    
        cin >> n_repeat;
    
        for (int i = 0; i < n_repeat; i++)
        {
            cin >> value_input;
    
            if (value_input == "push")
                {
                    int number;
                    cin >> number;
                    my_vector.push_back(number);
                }
            
            else if (value_input == "pop")
            {
                if (my_vector.size() > 0)
                {
                    cout << my_vector[my_vector.size() - 1] << endl;
                    my_vector.pop_back();
                }
                else if (my_vector.size() == 0)
                {
                    cout << "-1" << endl;
                }
            }
    
            else if (value_input == "size")
            {
                cout << my_vector.size() << endl;
            }
    
            else if (value_input == "empty")
            {
                if (my_vector.size() > 0)
                {
                    cout << "0" << endl;
                }
                else if (my_vector.size() == 0)
                {
                    cout << "1" << endl;
                } 
            }
    
            else if (value_input == "top")
            {
                if (my_vector.size() > 0)
                {
                    cout << my_vector.back() << endl;
                }
                else if (my_vector.size() == 0)
                {
                    cout << "-1" << endl;
                } 
            }
    
        }
    
        return 0;
    }

     

    2. stack

    // using stack
    #include <iostream>
    #include <stack>
    
    using namespace std;
    
    int main()
    {
        //발생하는 딜레이를 줄여주는 역할
        ios::sync_with_stdio(0);
        //cin과 cout의 묶음을 풀어줌.
        cin.tie(0);
        
        int n_repeat;
        stack<int> my_stack;
        string value_input;
        
        cin >> n_repeat;
    
        for(int i; i < n_repeat; i++)
        {
            cin >> value_input;
    
            if (value_input == "push")
            {
                int number;
                cin >> number;
                my_stack.push(number);
            }
    
            else if (value_input == "pop")
            {
                if (my_stack.size() > 0)
                {
                    cout << my_stack.top() << endl;
                    my_stack.pop();
                }
                else if (my_stack.size() == 0)
                {
                    cout << "-1" << endl;
                }
            }
    
            else if (value_input == "size")
            {
                cout << my_stack.size() << endl;
            }
    
            else if (value_input == "empty")
            {
                if (my_stack.size() > 0)
                {
                    cout << "0" << endl;
                }
                else if (my_stack.size() == 0)
                {
                    cout << "1" << endl;
                }
            }
    
            else if (value_input == "top")
            {            
                if (my_stack.size() > 0)
                {
                    cout << my_stack.top() << endl;
                }
                else if (my_stack.size() == 0)
                {
                    cout << "-1" << endl;
                }
            }
        }
    
        return 0;
    }

     

    3. list

    // using list
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    
    int main()
    {
        //발생하는 딜레이를 줄여주는 역할
        ios::sync_with_stdio(0);
        //cin과 cout의 묶음을 풀어줌.
        cin.tie(0);
    
        int n_repeat;
        string value_input;
        list<int> my_list;
    
        cin >> n_repeat;
    
        while(n_repeat--)
        {
            cin >> value_input;
    
            if (value_input == "push")
                {
                    int number;
                    cin >> number;
                    my_list.push_back(number);
                }
            
            else if (value_input == "pop")
            {
                if (my_list.size() > 0)
                {
                    cout << my_list.back() << endl;
                    my_list.pop_back();
                }
                else if (my_list.size() == 0)
                {
                    cout << "-1" << endl;
                }
            }
    
            else if (value_input == "size")
            {
                cout << my_list.size() << endl;
            }
    
            else if (value_input == "empty")
            {
                if (my_list.size() > 0)
                {
                    cout << "0" << endl;
                }
                else if (my_list.size() == 0)
                {
                    cout << "1" << endl;
                } 
            }
    
            else if (value_input == "top")
            {
                if (my_list.size() > 0)
                {
                    cout << my_list.back() << endl;
                }
                else if (my_list.size() == 0)
                {
                    cout << "-1" << endl;
                } 
            }
        }
    
        return 0;
    }

     

    해당 문제를 풀면서 처음 접했던 것은

        //발생하는 딜레이를 줄여주는 역할
        ios::sync_with_stdio(0);
        //cin과 cout의 묶음을 풀어줌.
        cin.tie(0);

    해당 부분 입니다.

    해당 부분이 없을 경우 문제를 제출할 때 실행속도 문제가 발생하게 됩니다.

    https://mokchanic.tistory.com/5

     

    ios::sync_with_studio, cin.tie, cout.tie

    - 위의 세가지를 사용하기 위해서는 C와 C++의 입출력을 혼용하지 않으면서, thread를 사용할 때 주의를 해야 합니다. 1. ios::sync_with_studio(bool_sync); 위의 구문은 C++ 표준 스트림들이 C표준 스트림들과

    mokchanic.tistory.com

     


     

    'Algorithm > _Baekjoon' 카테고리의 다른 글

    Baekjoon_10845_큐  (0) 2023.05.18
    Baekjoon_1406_에디터  (0) 2023.05.17
    Baekjoon_1874_스택 수열  (0) 2023.05.15
    Baekjoon_9012_괄호  (0) 2023.05.14
    Baekjoon_9093_단어 뒤집기  (0) 2023.05.14
Designed by Tistory.