관리 메뉴

어읽로꾸거

BOJ 2504 괄호의 값 본문

알고리즘

BOJ 2504 괄호의 값

어읽로꾸거 2019. 3. 31. 20:51

백준 2504 링크

https://www.acmicpc.net/problem/2504

풀이 과정

이 문제는 크게 두 부분으로 나눠서 풀었습니다.

 

한 부분은 주어진 괄호가 올바른 괄호인지를 판단하는 부분입니다. 스택을 이용하여 판단할 수 있습니다. 만약 괄호가 올바르지 않다면 바로 '0'을 출력하지만 올바르다면 다음 부분으로 넘어갑니다.

 

만약 괄호가 올바르다면 괄호의 값을 구하면 됩니다.

 

괄호의 값을 구하는 방법은 다음과 같습니다.

 

1. 둘러 싸일때 마다 발생하는 값을 저장하는 배열을 생성한다. ex) int ar[20];

 

( ) 이면 한번 둘러싸였으므로 ar[1]에 발생하는 값을 저장하면 되고 ([( )]) 이면 3번 둘러싸였으므로 ar[3]에 저장해주면 됩니다.

 

주어지는 괄호들이 최대 30개 이므로 둘러 싸이는 괄호의 수는 최대 15개까지 입니다. 널널하게 20개 정도 만듭니다.

 

2. 입력된 배열을 하나씩 보면서 각각 처리 해준다.

 

저는 now 라는 변수로 몇 번째 괄호에 둘러싸여있나를 기록하여 '(' 나 '[' 면 now++ 를 해주고 반대로 닫히는 부호가 온다면 now-1 에 now 에서 구한 수들을 전달해주고 now-- 를 해줍니다.

 

만약 "()" 이나 "[]" 라면 2나 3을 더해주면 됩니다.

 

마지막으로 ar[0]의 값을 출력하면 끝 😎

코드

#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main() {
    freopen("input.txt", "r", stdin);
    int now = 0, ar[20]; //몇번째 괄호에 값이 들어가는지 저장
    string s;
    stack <char> st;
    for (int i = 0; i <= 19; i++) ar[i] = 0;
    cin >> s;

    for (int i = 0; i < s.length(); i++) {
        if (!st.empty()) {
            if (st.top() == '('&&s[i] == ')') st.pop();
            else if (st.top() == '['&&s[i] == ']') st.pop();
            else st.push(s[i]);
        }
        else st.push(s[i]);
    }

    if (st.empty()) {
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '(' || s[i] == '[') {
                now++;
            }
            else if (s[i] == ')' && s[i - 1] == '(') {
                ar[now - 1] += 2;
                ar[now--] = 0;
            }
            else if (s[i] == ']' && s[i - 1] == '[') {
                ar[now - 1] += 3;
                ar[now--] = 0;
            }
            else if (s[i] == ')') {
                ar[now - 1] += ar[now] * 2;
                ar[now--] = 0;
            }
            else if (s[i] == ']') {
                ar[now - 1] += ar[now] * 3;
                ar[now--] = 0;
            }
        }
        cout << ar[0];
    }
    else cout << 0;
}

'알고리즘' 카테고리의 다른 글

BOJ 2975 Transactions  (0) 2019.04.02
BOJ 4287 Word Ratios  (0) 2019.04.01
BOJ 16118 달빛여우  (0) 2019.03.30
BOJ 16469 소년 점프  (0) 2019.03.28
BOJ 16953 A → B  (0) 2019.03.27