백준/Inha Algorithm Study Group

DAY3 중급 - 백준 17287번 (C++)

FDEE 2020. 9. 4. 17:35

www.acmicpc.net/problem/17287

 

17287번: The Deeper, The Better

대괄호, 중괄호, 소괄호와 0부터 9까지의 숫자로 이루어진 문자열 S가 주어진다. 문자열 S는 올바른 괄호 문자열에 숫자를 끼워 넣은 형태이고, 두 숫자가 서로 붙어있는 경우는 없다. 올바른 괄

www.acmicpc.net

 

<답안>

#include <iostream>
using namespace std;
int main()
{
    string s;
    int max = -1,sum = 0;

    cin>>s;

    for(int i=0; i<s.size(); i++)
    {
        if(s[i] == '[')
        {
            sum += 3;
        }
        else if(s[i] == '{')
        {
            sum += 2;
        }
        else if(s[i] == '(')
        {
            sum += 1;
        }
        else if(s[i] == ')')
        {
            sum -= 1;
        }
        else if(s[i] == '}')
        {
            sum -= 2;
        }
        else if(s[i] == ']')
        {
            sum -= 3;
        }
        else if(s[i] >= '0' && s[i] <= '9')
        {
            if(sum > max)
                max = sum;
        }
    }
    cout<<max;
    return 0;
}

 

<설명>

처음에 접근이 쉽게되지 않았다. 숫자 기준으로 왼쪽 오른쪽? 같은숫자가 입력될수도 있는데 이건?

그러다가 머리를 스쳐간 개념은 [, {, ( 만나면 3,2,1 더하고, ), }, ] 만나면 1,2,3 빼면서 최고를 기록한 max값을 출력하면 되지않나?

 

그렇게 알고리즘은 그대로이다

[ 일때 +3, { 일때 +2, ( 일때 +1, )

) 일때 -1, } 일때 -2, ] 일때 -3

 

단, max값을 갱신하는 때는 "숫자"가 입력됬을때이다. 숫자없이 () 입력되는 경우는 피해야 하기 때문이다

그렇게 누적된 sum > max이면 max = sum 바꾼다음

최종적으로 max를 출력한다