문제
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다. X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다. 예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()()[]’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다.
- ‘()’ 인 괄호열의 값은 2이다.
- ‘[]’ 인 괄호열의 값은 3이다.
- ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
- ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
- 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.
예를 들어 ‘(()[[]])([])’ 의 괄호값을 구해보자. ‘()[[]]’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[ ]])’의 괄호값은 2×11=22 이다. 그리고 ‘([])’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다. 여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다.
입력
첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.
출력
첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.
예제 입력
(()[[]])([])
예제 출력
28
따로 함수를 써서 코드를 작성하지 않아서 코드가 좀 지저분해 보인다. 내가 이 문제를 처음 풀때 어려웠던 점은 char 배열을 선언하여 예제를 입력 받았을때, 결과 값은 정수로 나오기 때문에 애를 먹었다. char 배열로 ()의 값 '2' 나 []의 값 '3' 을 받아서 계산을 하게 되면 10 미만의 수는 아스키코드를 보고 계산을 복잡하게 할 수 있지만, 10 이상부터 계산이 복잡해져서 이렇게 풀기에는 복잡해진다. 내가 이 문제를 푼 포인트는 계산할 때 필요하지 않은 음수값을 써서 ' ( ' 입력은 스택에 -1을, ' [ ' 입력은 스택에 -2를 넣는 것이다. 또 각각의 짝이 맞아야 하기 때문에 ' ) ' 는 -9를 ' ] ' 는 -8를 넣는것이다.
< 문제 풀이 >
1. ' ( ' 의 입력은 스택에 -1를 넣고, ' [ ' 의 입력은 스택에 -2를 넣는다.
2. ' ) ' 와 ' ] ' 의 입력이 들어 왔을 때가 복잡해지는데, 두가지 경우 코드가 거의 똑같기 때문에 한가지만 설명 하겠다. ' ) ' 입력이 들어 왔을때 stack[top] 만약에 -1이 있다면 ' ( ' 이 그전에 들어가 있는 것이므로, stack[top] 에 2를 넣는다. 그럼 ' ( ) ' 이 부분이 2로 되는 것이다. 만약에 stack[top] 에 있는 숫자가 -1 이 아니라면 ' ) ' 괄호에 맞는 짝이 나타날때 까지 숫자를 더해야 하므로, stack에 ' ) ' 에 해당 하는 숫자 -9를 넣고, -1이 나타날때 까지 사이에 있는 숫자들을 모두 더한다. 만약에 짝에 맞는 -1이 나타나게 되면 지금까지 더한값들을 문제에 주어진 계산대로 ×2 한다.
3. ' ] ' 도 2의 방법과 마찬가지로 똑같이 코드를 짠다.
4. 마지막으로 괄호가 모자르거나 많으면 계산이 안되기 때문에 계산이 잘됐는지 확인해야 한다. 나는 boolean 변수 flag를 선언해서 stack에 있는 값들중에 0보다 작은 숫자가 있으면 괄호가 남아 음수가 남아있는 것이기 때문에 false로 바꾸고 0을 출력했다. 만약에 주어진 stack에 음수가 없다면 stack에 계산된 모든 값들을 더하여 그 값을 출력하면 정답을 얻을 수 있다.