백준/Inha Algorithm Study Group
DAY3 중급 - 백준 17287번 (C++)
FDEE
2020. 9. 4. 17:35
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를 출력한다