[백준] 2504 : 괄호의 값

letsbebrave·2022년 4월 9일
0

codingtest

목록 보기
89/146
post-thumbnail

문제

풀이

제대로 된 괄호 문자열인지 판별하는 건 괜찮았지만, 계산하는 게 너무 어려웠다.
tmp에 1을 주고(곱했을 때 숫자가 살아있게 하기 위해서) 열린 괄호를 만날 때마다 2나 3을 곱해주고 stack이란 배열에 넣어준다. (배열에 넣어주는 이유는 짝이 맞는지 안 맞는지 찾기 위해)
닫힌 괄호를 만날 때마다 stack에 들어가 있는 마지막 괄호와 짝이 맞는다면 res에 그동안의 tmp 값을 더해준다.
그리고 tmp를 2로 나눠주는데, 그 이유는 (( 이렇게 괄호가 2개 있으면 2가 곱해지는 건 1번이므로 짝이 만들어졌다면 2로 나눠준다. 또한 stack에서도 마지막 괄호를 빼내줘야 한다.

참고 블로그 : https://dev-dain.tistory.com/149

s = input()
stack = []
tmp = 1
res = 0

for i in range(len(s)):
  if s[i] == '(':
    tmp *= 2
    stack.append(s[i])
  elif s[i] == '[':
    tmp *= 3
    stack.append(s[i])

  elif s[i] == ')':
    if not stack or stack[-1] == '[':
      res = 0 # 제대로 된 괄호 아닌 경우
      break
    if s[i-1] == '(':
      res += tmp # 짝을 찾았으므로 최종 결과에 더해줌
    tmp //= 2 # (( 열린 괄호가 2개 있는 경우 2가 곱해지는 건 1번이므로 짝이 만들어졌다면 2로 나눠줘야
    stack.pop() # pop도 까먹지 말고 꼭
  
  else: # n[i] == "]"
    if not stack or stack[-1] == '(':
      res = 0 # 제대로 된 괄호 아닌 경우
      break
    if s[i-1] == '[':
      res += tmp
    tmp //= 3
    stack.pop() # pop 까먹지 말기

if stack: # stack이 모두 pop되지 않아 비어있지 않은 경우 제대로 된 괄호가 아니므로 res = 0!
  res = 0
print(res)
profile
그게, 할 수 있다고 믿어야 해

0개의 댓글