https://www.acmicpc.net/problem/2504
풀이 참조: [백준 BOJ / C++] 2504번: 괄호의 값
아이디어:
1. 스택과 이전 글자 사용
2. 최종 결과 ans(초기값 0)와 중간 계산값 tmp (초기값 1) 사용
3. 분배 법칙 활용
X(A+B) = AX + BX
4. 들어오는 ( 에 대해 미리 2를 곱하고
5. 들어오는 ) 에 대해
5-1. 스택이 비었거나 이전 문자가 ( 가 아니라면
0 출력하며 종료
5-2. 이전 문자가 ( 이면
ans에 tmp를 더하고 tmp는 2로 나누기
5-3. 이전 문자가 ( 이 아니면
tmp를 2로 나누기
6. [ 와 ] 도 똑같이 적용
) 와 ] 에서만 계산하는게 아니라
( 와 [ 에서도 곱셈을 해주면서 ) 와 ]에서 tmp를 더하고 나눗셈으로 tmp를 풀어주는 과정이 중요
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int tmp = 1, ans = 0;
char pre = ' ';
string str;
stack<char> S;
cin >> str;
for (auto i : str) {
if (i == '(') {
tmp *= 2;
S.push(i);
}
else if (i == '[') {
tmp *= 3;
S.push(i);
}
else if (i == ')') {
if (S.empty() || S.top() != '(') {
ans = 0;
break;
}
else if (pre == '(') {
ans += tmp;
tmp /= 2;
S.pop();
}
else if (pre != '(') {
tmp /= 2;
S.pop();
}
}
else if (i == ']') {
if (S.empty() || S.top() != '[') {
ans = 0;
break;
}
else if (pre == '[') {
ans += tmp;
tmp /= 3;
S.pop();
}
else if (pre != '[') {
tmp /= 3;
S.pop();
}
}
pre = i;
}
if (!S.empty()) {
cout << 0;
return 0;
}
cout << ans;
return 0;
}
'algorithm' 카테고리의 다른 글
백준 17298번 오큰수 (0) | 2025.03.04 |
---|---|
백준 6198번 옥상 정원 꾸미기 - 모노톤 스택 (0) | 2025.03.02 |
백준 2493번 탑 (0) | 2025.03.02 |
백준 10799번 쇠막대기 (0) | 2025.02.27 |
백준 17413번 단어 뒤집기 2 (0) | 2025.02.23 |