-
Baekjoon_10828_스택Algorithm/_Baekjoon 2023. 5. 14. 18:39
일단, 기초부터 천천히 풀어볼 것이며 첫 번째로 주어진 문제인 스택에 대해 풀어보기로 합시다.
문제 주소: https://www.acmicpc.net/problem/10828
스택문제는 다음과 같습니다.
첫 문제답게 간단하며, 입력을 몇번할지 정한 후 주어진 명령을 통해 출력을 받는 프로그램 입니다.
저는 이 문제를 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
'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