일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 분할정복
- DFS와BFS
- AndroidStudio
- codingtest
- 안드로이드스튜디오
- C++
- cos pro
- django
- 코테
- Python
- cos pro 1급
- 코드품앗이
- 파이썬
- Algorithm
- DFS
- cos
- 백준
- 코딩테스트
- vuejs
- 안드로이드
- DART
- BAEKJOON
- 알고리즘
- android
- Flutter
- 동적계획법과최단거리역추적
- 개발
- Vue
- 동적계획법
- issue
- Today
- Total
Development Artist
[Baekjoon, C++] 10828번 : 스택 본문
도입
백준 단계별 풀기에서 스택 1번째 문제이다.
해당 문제를 읽고 나서 큰 그림을 한번 짜 본다. 보통 어떤 문제에 직면했을 때, 이런 식으로 시작하는 습관이 있다.
첫 번째로, '스택은 무엇인가?'에 대한 고민이다. 문제에서 나오는 push, pop, size, empty, top의 명령은 stack 자료 구조에서 사용하는 명령들이다. 따라서, 스택이라는 것이 무엇인지 알아야 한다. 스택(stack)이란, 영어에서 '쌓다'라는 의미를 가진다. 스택을 다룰 때는 다음과 같은 구조를 떠올리면 된다. bottom이 막혀 있는 것이 특징이다.
우리가 a에서 j까지의 알파벳을 순서대로 스택에 넣는다고 가정하면, 스택 구조에서는 아래와 같이 들어가게 된다. 만약 여기서 내가 g를 빼고자 하면 어떻게 해야 할까? 그렇다. j부터 i h 순서로 빼야 한다. 즉, 스택은 LIFO(Last In First Out)의 방식을 취한다. 마지막으로 들어간 녀석이 제일 먼저 나오는 방식이다.
그러면 현재 j까지 쌓여 있다고 가정하고, 다시 문제로 돌아가, 명령어들을 한번 수행해보자.
push k : k를 스택에 넣는다. j위에 쌓인다. ( 구조 bottom부터, a, b, c, d, e, f, g, h, i, j, k )
pop : 스택의 제일 위(Top)의 값을 꺼낸다. j를 꺼낸다. ( 구조 bottom부터, a, b, c, d, e, f, g, h, i )
size : 스택에 들어있는 값들의 개수, a~j까지 10개
empty : 스택이 비어 있는지, 비어 있지 않으니까 0을 반환
top : 현재 가장 위에 j가 있으니 j를 출력.
※ pop과 top의 차이 : pop은 그 값을 꺼내서 스택에서 없애는 것, top은 그 값을 출력하기만 하고 스택에서는 계속 존재.
두 번째는, for문을 떠올렸다. N을 첫 번째 입력으로 명령어 수를 받으면 그 수만큼 명령어를 처리해야 한다. 반복적으로 명령어를 처리하는 것이 효율적이다.
세 번째는, case 분류이다. 명령어들의 종류는 5가지다. push, pop, size, empty, top. 그렇다면 반복적으로 1~N까지의 명령어들을 받을 텐데, 각 명령어마다 어떤 명령어인지 구분할 수 있어야 한다. 그래야, 각각에 맞는 처리를 해줄 수 있기 때문이다. 명령어가 push 일 때, pop 일 때, size 일 때, empty 일 때, top 일 때.
네 번째는, 표준 라이브러리를 찾는 것이다. 우리가 코딩을 하는 데 있어서 스택의 구조부터 전부 코딩할 필요가 없다. 미리 만들어 놓은 좋은 라이브러리들이 있을 수 있다. 이것들을 찾아서 사용하면 코딩의 난이도를 낮출 수 있다.
C++에서는 표준 라이브러리로 stack과 string을 제공한다. 우리는 이것들을 가져와서 사용할 예정이다. 더 자세한 내용은 아래 링크를 통해 확인할 수 있다.
www.cplusplus.com/reference/stack/stack/
www.cplusplus.com/reference/string/
Visual Studio 2019로 코드를 작성한 결과다. 간단한 설명을 라인마다 주석을 달아 놓았다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include<iostream>
#include<stack> // 표준 라이브러리 stack을 사용하기 위함
#include<string> // 표준 라이브러리 string을 사용하기 위함. string 타입을 쓰기 위해 포함
using namespace std;
int main() {
int numberOfCommand; // 명령어수 N 선언
stack<int> st; // int Data Type을 넣을 stack 선언
string str_command; // 명령어 push, pop, size, empty, top 등의 명령어를 받을 string 변수 선언
cin >> numberOfCommand; //명령어수 N을 유저로 부터 받는다.
for (int i = 0; i < numberOfCommand; i++) {
cin >> str_command; // 유저로 부터 명령어를 받는다.
if (str_command._Equal("push")) { //str_command이 push 일때 // 뒤에 오는 숫자를 st에 넣는다.
int number_stack;
cin >> number_stack;
st.push(number_stack);
}
else if (str_command._Equal("pop")) { //str_command이 pop 일때 // st의 젤 위의 값을 뽑아 출력한다.
if (!st.empty()) {
cout << st.top() << endl;
st.pop();
}
else {
cout << "-1" << endl;
}
}
else if (str_command._Equal("size")) { //str_command이 size 일때 // st의 사이즈를 출력
cout << st.size() << endl;
}
else if (str_command._Equal("empty")) { //str_command이 empty 일때 // st가 비었는지 아닌지, 비었으면 1, 않비었으면 0
if (st.empty()) {
cout << "1" << endl;
}
else {
cout << "0" << endl;
}
}
else if (str_command._Equal("top")) { //str_command이 top 일때 // st의 젤 위를 출력, pop은 젤 위의 값을 출력하고 st에서 지우는 반면, top은 젤 위를 출력만
if (!st.empty()) {
cout << st.top() << endl;
}
else {
cout << "-1" << endl;
}
}
}
return 0;
}
|
cs |
다섯 번째로, 예외처리를 떠올렸는데, 개발자가 기대하는 입력값을 받지 못하는 경우에 대한 처리가 그중 하나일 수 있다. 하지만, 여기서는 따로 다루지 않겠다.
이상으로 첫 문제 10828번이었다. 피드백은 언제나 환영이다.
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon, C++] 1874번 : 스택 수열 (0) | 2021.01.09 |
---|---|
[Baekjoon, C++] 4949번 : 균형잡힌 세상 (0) | 2021.01.08 |
[Baekjoon, C++] 9012번 : 괄호 (0) | 2021.01.07 |
[Baekjoon, C++] 10773번 : 제로 (0) | 2021.01.06 |
[Baekjoon] 시작 (0) | 2021.01.05 |