본문 바로가기

알고리즘/python

[python/파이썬] 백준 2504 괄호의 값

반응형

문제

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다.

  1. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 
  2. 만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다. 
  3. X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다.

예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()()[]’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다. 

  1. ‘()’ 인 괄호열의 값은 2이다.
  2. ‘[]’ 인 괄호열의 값은 3이다.
  3. ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
  4. ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
  5. 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.

예를 들어 ‘(()[[]])([])’ 의 괄호값을 구해보자. ‘()[[]]’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[]])’의 괄호값은 2×11=22 이다. 그리고 ‘([])’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다.

여러분이 풀어야 할 문제는 주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 것이다. 

입력

첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다. 단 그 길이는 1 이상, 30 이하이다.

출력

첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다. 만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다. 

예제 입력 1 복사

(()[[]])([])

예제 출력 1 복사

28

예제 입력 2 복사

[][]((])

예제 출력 2 복사

0

 

 

 

[소스 코드]

입력받은 데이터를 처음부터 보면서 왼쪽 괄호가 나오면 스택에 집어넣고 괄호의 모양에 따라

tmp 값을 2배 혹은 3배 해준다.

만일 짝이 맞지 않는 반대쪽 괄호가 나오거나, 스택이 비어있는 상태에서 왼쪽 괄호가 아닌 오른쪽 괄호로 시작하게 될 경우 올바른 괄호열이 아니기에 result는 0이 된다.

짝이 맞는 오른쪽 괄호가 나오면 tmp값을 result에 더해주고 stack에서 왼쪽괄호를 제거한다.

코드에도 썼듯이 처음에는 stack.pop()을 result값 증가 바로 아래줄, if문 내부에 입력하였는데 틀렸다고 나왔다

안에 쓰나 밖에 쓰나 비슷한 것 같은데 왜 틀리고 맞는 게 갈리는지 아직 조금 의문이다.

result 값을 증가시킨 후에는 다시 tmp를 사용해야 하기에 다시 1로 만들어 준다.

모든 연산이 끝난 후에도 스택 내부에 괄호가 남아있다면

올바르지 않은 괄호열이기에 0을 출력하고 그렇지 않은 경우 result 값을 출력한다

data = list(input())

stack = []
result = 0
tmp = 1

for i in range(len(data)):
    if data[i] =='(':
        stack.append('(')
        tmp *= 2
    elif data[i] =='[':
        stack.append('[')
        tmp *= 3
    elif data[i] == ')':
        if not stack:
            result = 0
            break
        if stack[-1]=='[':
            result = 0
            break
        if data[i-1] == '(':
            result += tmp
            #이 위치에 stack.pop()이 있었을 때는 틀렸다.
        stack.pop()        
        tmp//=2
    else:
        if not stack:
            result = 0
            break
        if stack[-1]=='(':
            result = 0
            break
        if data[i-1]=='[':
            result += tmp
            #이 위치에 stack.pop()이 있었을 때는 틀렸다.
        stack.pop()
        tmp //= 3

if stack:
    print(0)
else: print(result)
반응형