지난 번, 재귀함수 풀이에 이어서 스택 풀이입니다.
문제 접근법.
1. 괄호에 대해서 먼저 연산을 할 필요가 있다.
2. 숫자가 있는 경우, 앞에 있는 문자나 괄호식에 대해서 곱셈을 해줘야 한다.
괄호와 같은 우선 순위가 필요한 연산일 경우, 적합한 자료구조는 스택입니다. 스택을 이용해서, 특정 우선 순위에 대해서 먼저 처리해주는 것이 필요합니다.
H, C, O에 대해서는 해당하는 숫자(1, 14, 16)를 넣어줍니다.
(은 우선순위 연산을 위해서 사용되므로, 그대로 넣어줍니다.
)의 경우에는 (를 만날 때까지 만나는 숫자들을 모두 더하도록 처리합니다.
숫자의 경우에는 스택의 Top에 대해서 곱셈을 처리해서, *다시 숫자를 넣어줍니다.
* )의 경우에 모든 숫자를 더할 수 있는 이유는, 스택에 들어가는 숫자들은 모두 곱셈이 된 상태로 들어가기 때문입니다.
이 과정이 끝나고 나면, 스택에는 있는 모든 숫자를 더해주면 정답이 나오게 됩니다.
이 과정이 정확하게 이해가 안되면, 스택의 기본 문제들을 풀면서 이해도를 높이는 것을 추천합니다.
해설코드(C++)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include <iostream>
#include <string>
#include <cstdlib>
#include <stack>
using namespace std;
stack<string> tack;
string str;
int answer = 0;
int main(void) {
freopen("input.txt", "r", stdin);
cin >> str;
int idx = 0;
if (c == "H" || c == "C" || c == "O" || c == "(")
else if (c == ")") {
int tmp = 0;
tack.pop();
}
tack.pop();
}
else if(c >= "1" && c <= "9"){
int tmp = 0;
tmp = 1;
}
tmp = 12;
}
tmp = 16;
}
else {
tmp = stoi(tack.top());
}
tack.pop();
tmp = tmp * stoi(c);
}
idx += 1;
}
tack.pop();
}
cout << answer << endl;
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'알고리즘 > 백준' 카테고리의 다른 글
[11722번] 가장 긴 감소하는 부분 수열(DP) (0) | 2019.10.04 |
---|---|
[11722번] 가장 긴 감소하는 부분 수열 (0) | 2019.10.03 |
[17144번] 미세먼지 안녕! (C++, 삼성코딩테스트) (0) | 2019.10.03 |
[2257번] 화학식량(재귀함수 풀이) (0) | 2019.09.30 |
[2961번]도영이가 만든 맛있는 음식 (0) | 2019.09.29 |