배운 것
괄호만 있는 것이 아니라 숫자도 있어서 새로 stack을 만들어줘야 하나 고민했는데
그럴 필요 없이 sum이랑 num이란 변수를 만들어줘서 push시켜줄 때 num에 곱해줄 숫자 기록하면 됨
정답 코드
// Authored by : std-freejia
// Co-authored by : BaaaaaaaaaaarkingDog
// http://boj.kr/cbef82389d1048db80c9652d18b71304
#include <bits/stdc++.h>
using namespace std;
stack<char> s;
string str;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> str;
int sum = 0; // 누적해서 더해질 값
int num = 1; // 곱해질 값
for(int i = 0; i < str.size(); i++){
if(str[i] == '('){
num *= 2; // 소괄호가 나오면 곱해질 값 2배 증가
s.push(str[i]);
}
else if(str[i] == '['){
num *= 3; // 대괄호가 나오면 곱해질 값 3배 증가
s.push(str[i]);
}
else if(str[i] == ')'){
if(s.empty() || s.top() != '('){
cout << 0;
return 0;
}
if(str[i-1] == '(') sum += num; // 직전 괄호가 여는 괄호였다면 sum에 값 추가
s.pop();
num /= 2; // 소괄호 쌍이 사라졌으니 2로 나눔
}
else{ // str[i] == ']'
if(s.empty() || s.top() != '['){
cout << 0;
return 0;
}
if(str[i-1] == '[') sum += num; // 직전 괄호가 여는 괄호였다면 sum에 값 추가
s.pop();
num /= 3; // 소괄호 쌍이 사라졌으니 2로 나눔
}
}
if(s.empty()) cout << sum;
else cout << 0;
}
/*
boj 10799 쇠 막대기 문제의 아이디어와 비슷하게 붙어있는 () 혹은 []를 만나면
sum에 점수를 더해줌. () 혹은 []이 몇 점인가는 중첩된 소괄호/대괄호의 곱으로
계산 가능하고 이는 변수 num에 저장이 됨.
*/
'Algorithm > C++' 카테고리의 다른 글
[백준 4179] 불! (0) | 2022.08.29 |
---|---|
[백준 1926] 그림 (0) | 2022.08.19 |
[백준 10799] 쇠막대기 (0) | 2022.08.17 |
[백준 1406번] 에디터 (0) | 2022.08.10 |
[백준 11328번] Strfry (0) | 2022.08.10 |
댓글