check 배열과 재귀구조를 사용했다.
함수는 같은 괄호 영역 내부를 계산하고 새로운 괄호를 만나면 재귀를 호출하는 방식이다.
괄호 다음에 숫자가 오는 경우를 잘 처리해야 한다.
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 | #include <stdio.h> #include <string.h> #include <iostream> #include <string> using namespace std; int check[101], hc, cc, oc, len, result, dx[] = { 1,12,16 }; string s, ch = "HCO23456789"; int indexer(char c) { int i = 0; for (; i < 3; i++) if (c == ch[i]) break; return i; } int solve(int p) { int cnt[3] = { 0, }, ans = 0, i; //hco for (; p < len; p++) { if (check[p]) continue; check[p] = 1; for (i = 0; i < 11; i++) { if (s[p] == ch[i]) { if (i < 3) cnt[i]++; else cnt[indexer(s[p - 1])] += ch[i] - '0' - 1; } } if (s[p] == '(') ans += solve(p + 1); else if (s[p] == ')') { p++; for (i = 0; i < 3; i++) ans += cnt[i] * dx[i]; if (s[p] >= '0' && s[p] <= '9') check[p] = 1, ans *= s[p] - '0'; return ans; } } for (i = 0; i < 3; i++) ans += cnt[i] * dx[i]; return ans; } int main() { cin >> s; len = s.length(); cout << solve(0) << '\n'; return 0; } | cs |
'BOJ' 카테고리의 다른 글
10840 구간성분 (0) | 2018.04.04 |
---|---|
6324 URLs (0) | 2018.04.04 |
14617 제 3회 IUPC (0) | 2018.03.09 |
10573 증가하는 수 (0) | 2018.02.18 |
11585 속타는 저녁 메뉴 (0) | 2018.02.18 |