문제: 괄호의 값 (백준 2504번)
문제 분석
괄호 ()와 []로 이루어진 문자열이 주어질 때, 올바른 괄호열이라면 그 값을 계산하고, 올바르지 않다면 0을 출력하는 문제이다.
괄호의 구조를 유지하면서 값을 계산해야 하므로 스택 활용
- (가 나오면 temp를 2배, [가 나오면 3배
- )가 나오면 (가 있어야 하고, ]가 나오면 [가 있어야 함
값을 계산하는 규칙
- 닫는 괄호 )나 ]가 나왔을 때, 직전이 여는 괄호였다면 현재 temp 값을 sum에 더함
- 닫는 괄호가 나왔을 때는 temp 값을 원래대로 되돌림
유효성 검사
- 스택이 비어있거나 올바르지 않은 괄호가 나오면 0 출력
- 문자열을 끝까지 처리한 후에도 스택이 비어있지 않다면 0 출력
전체 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
string str; cin >> str;
stack<char> s;
int sum = 0, temp = 1;
for (size_t i = 0; i < str.size(); i++) {
if (str[i] == '(') {
s.push('(');
temp *= 2;
}
else if (str[i] == '[') {
s.push('[');
temp *= 3;
}
else if (str[i] == ')') {
if (s.empty() || s.top() != '(') {
cout << 0;
return 0;
}
if (str[i - 1] == '(') sum += temp; // 바로 앞이 '('이면 값을 더함
s.pop();
temp /= 2; // temp 복원
}
else if (str[i] == ']') {
if (s.empty() || s.top() != '[') {
cout << 0;
return 0;
}
if (str[i - 1] == '[') sum += temp; // 바로 앞이 '['이면 값을 더함
s.pop();
temp /= 3; // temp 복원
}
}
if (!s.empty()) {
cout << 0;
return 0;
}
cout << sum;
return 0;
}
'C++ > Algorithm' 카테고리의 다른 글
[C++] 백준/Gold/3055. 탈출 (0) | 2025.02.11 |
---|---|
[C++] 백준/Gold/2042. 구간 합 구하기 (0) | 2025.02.10 |
[C++] 백준/Gold/1068. 트리 (0) | 2025.02.06 |
[C++] 백준/Silver/5014. 스타트링크 (1) | 2025.02.05 |
[C++] 백준/Silver/1309. 동물원 (0) | 2025.02.04 |