문제
"맞았습니다" 코드
#include <bits/stdc++.h>
using namespace std;
stack<char> s;
string str;
int main(void) {
ios_base::sync_with_stdio(0);
cin.ignore(0);
getline(cin, str);
bool check = true; // 짝이 안맞는 틀린 괄호인지 체크
int sum = 0; // 누적해서 더해질 값
int num = 1; // 곱해질 값
for(int i = 0; i < str.length(); i++){ // 괄호가 틀린 경우를 필터링
if(str[i] == '(' || str[i] == '[') {
s.push(str[i]); continue;
}
else if(str[i] == ']' && s.size() > 0){
if(s.top() == '[') {
s.pop();
continue;
}
}
else if(str[i] == ')' && s.size() > 0){
if(s.top() == '(') {
s.pop();
continue;
}
}
check = false; break;
}
if(!check || !s.empty()){ // 틀린 괄호쌍이니까 0 출력 후 종료
cout << '0';
return 0;
}
while(1){ // 스택이 비어 있도록 처리
if(s.empty()) break;
s.pop();
}
for(int i = 0; i < str.length(); i++){
if(str[i] == '('){
s.push(str[i]);
num *= 2; // 여는 괄호들이 겹치면 2배가 된다.
}
else if(str[i] == ')'){
if(str[i-1] == '('){ // 직전 괄호가 여는 괄호였다면
sum += num;
}
s.pop();
num /= 2; // 괄호 () 한쌍이 제거됬으니까 곱해질 값을 /2 해준다.
}
else if(str[i] == '['){
s.push(str[i]);
num *= 3;
}
else if(str[i] == ']'){
if(str[i-1] == '['){ // 직전 괄호가 여는 괄호였다면
sum += num;
}
s.pop();
num /= 3; // 괄호 [] 한쌍이 제거됬으니까 곱해질 값을 /3 해준다.
}
}
cout << sum;
return 0;
}
리뷰
맞왜틀 하면서 골머리싸맸다.
초반에는 스택이 비어있을 수 있는데 top을 참조하니까 런타임 에러가 났다.
스택 size()를 확인하면서 처리하자니 조건문이 깊어졌다.
그래서 앞단에서 '틀린 괄호쌍'을 걸러내도록 하는 for문을 두도록 구조를 바꿨다.
일단 틀린 괄호쌍을 걸러내고, 두 번째 for문 에서는 계산만 하도록 했다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
토마토 백준 7576 c++ (0) | 2021.12.02 |
---|---|
그림 백준 1926 c++ (0) | 2021.11.28 |
회전하는 큐 백준 1021번 c++ (0) | 2021.11.24 |
탑 백준 2493 c++ (0) | 2021.11.24 |
큐2 백준 18258번 c++ (0) | 2021.11.24 |