[BOJ] 백준 2504 괄호의 값
문제 링크 : https://www.acmicpc.net/problem/2504
괄호가 문자열로 주어집니다.
보통의 괄호문제는 괄호의 짝이 만나면 POP 하면 되는 문제 입니다.
이 문제는 거기에 한술 더 떠서 POP 뿐만 아니라 값 계산까지 해야 하는 문제 입니다.
만약 " (()[[]()]) " 괄호를 계산해야 한다고 한다면, 맨 왼쪽부터 스택에 넣겠죠.
( → (( → (2 → (2[ →(2[[ → (2[3 → (2[3( → (2[32 → (2<3+2>*3 → (215 → (17 → 34
이 순으로 계산이 됩니다.
즉, 괄호의 짝을 만날때까지 스택에 있는 것들을 전부 더하고, 그 괄호의 짝에 해당하는 값을 곱해주면 되는 문제 입니다.
그리고 스택의 중간에 숫자가 들어가는 만큼 괄호의 짝이 안맞을때 에러 처리하는 부분을 깔끔하게 처리해주어야 합니다.
소스 코드 :
문제 링크 : https://www.acmicpc.net/problem/2504
괄호가 문자열로 주어집니다.
보통의 괄호문제는 괄호의 짝이 만나면 POP 하면 되는 문제 입니다.
이 문제는 거기에 한술 더 떠서 POP 뿐만 아니라 값 계산까지 해야 하는 문제 입니다.
만약 " (()[[]()]) " 괄호를 계산해야 한다고 한다면, 맨 왼쪽부터 스택에 넣겠죠.
( → (( → (2 → (2[ →(2[[ → (2[3 → (2[3( → (2[32 → (2<3+2>*3 → (215 → (17 → 34
이 순으로 계산이 됩니다.
즉, 괄호의 짝을 만날때까지 스택에 있는 것들을 전부 더하고, 그 괄호의 짝에 해당하는 값을 곱해주면 되는 문제 입니다.
그리고 스택의 중간에 숫자가 들어가는 만큼 괄호의 짝이 안맞을때 에러 처리하는 부분을 깔끔하게 처리해주어야 합니다.
소스 코드 :
#include#include #include using namespace std; int main() { string s; cin >> s; stack st; bool error = false; for (int i = 0; i < s.length(); i++) { if (s[i] == '(' || s[i] == '[') { st.push(s[i]); } else { if (s[i] == ')') { int tmp = 0; if (st.empty()) { error = true; break; } // 괄호쌍 사이의 숫자가 있다면 전부 더함. while (st.top() != '(') { if (st.top() == ']') { error = true; break; } tmp += st.top(); st.pop(); if (st.empty()) { error = true; break; } } if (error) break; st.pop(); // 마지막 '(' 제거. // 괄호쌍 중간에 숫자가 없다면 그냥 2 push, 있다면 전체를 포괄하는 괄호이므로 2를 곱해줌 tmp == 0 ? st.push(2) : st.push(2 * tmp); } // ')' 와 동일한 로직. else if (s[i] == ']') { int tmp = 0; if (st.empty()) { error = true; break; } while (st.top() != '[') { if (st.top() == '(' || st.empty()) { error = true; break; } tmp += st.top(); st.pop(); if (st.empty()) { error = true; break; } } if (error) break; st.pop(); // 마지막 '[' 제거. tmp == 0 ? st.push(3) : st.push(3 * tmp); } } if (isdigit(s[i])) { error = true; break; } } if (error) cout << '0' << endl; else { int res = 0; while (!st.empty()) { if (st.top() != '(' && st.top() != '[') { res += st.top(); st.pop(); } else { error = true; break; } } if (error) cout << '0' << endl; else cout << res << endl; } }
댓글
댓글 쓰기