[백준/C++] 2504번 괄호의 값
2021. 3. 23. 19:16ㆍ알고리즘/구현
728x90
반응형
문제: www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일
www.acmicpc.net
문제풀이
스택과 배열을 이용하여 문제를 풀었다.
스택의 크기로 괄호가 몇 겹이 있는지 알 수 있고 스택의 크기를 인덱스로 하여 같은 수의 겹에 쌓여있는 수를 모두 더하고 한 겹을 벗어날 때마다 괄호 (, ]에 따라 2나 3을 곱해주었다.
( ) -> arr[s.size()] += 2
[ ] -> arr[s.size()] += 3
) ) -> arr[s.size()] += arr[s.size()+1]*2
] ] -> arr[s.size()] += arr[s.size()+1]*3
나머지는 에러 처리
코드
#include <iostream>
#include <stack>
using namespace std;
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
string str;
cin>>str;
int arr[30] = {0,};
stack<char> s;
for(int i=0; i<str.length(); i++){
if(str[i] == '(' || str[i] == '['){
s.push(str[i]);
}
else{ //str[i] == ')' || str[i] == ']'
if(s.empty()){ //에러처리
s.push(str[i]);
break;
}
else{
if(str[i] == ')'){
if(s.top() == '('){ //s.top()가 '[' 이면 에러
s.pop();
if(str[i-1] == '('){
arr[s.size()] += 2;
}
else{
arr[s.size()] += arr[s.size()+1]*2;
arr[s.size()+1] = 0; //두 번째 괄호 덩어리에서 배열 쓸 수 있으므로 초기화
}
}
}
else if(str[i] == ']'){
if(s.top() == '['){//s.top()가 '(' 이면 에러
s.pop();
if(str[i-1] == '['){
arr[s.size()] += 3;
}
else{
arr[s.size()] += arr[s.size()+1]*3;
arr[s.size()+1] = 0; //두 번째 괄호 덩어리에서 배열 쓸 수 있으므로 초기화
}
}
}
}
}
}
if(s.empty())
cout<<arr[0];
else
cout<<0;
return 0;
}
결과
728x90
반응형
'알고리즘 > 구현' 카테고리의 다른 글
[백준/C++] 4889번 안정적인 문자열 (0) | 2021.03.24 |
---|---|
[백준/C++] 10799번 쇠막대기 (0) | 2021.03.23 |
[백준/C++] 5430번 AC (0) | 2021.03.22 |
[백준/C++] 18258번 큐 2 (0) | 2021.03.21 |
[백준/C++] 1021번 회전하는 큐 (0) | 2021.03.21 |