본문 바로가기
알고리즘

괄호의 값 [백준 2504] - python

by 우보틀 2022. 3. 25.

 

import sys
input = sys.stdin.readline

def BOJ2504() :
  def is_good(args) :
    stack = []
    flag = True

    for arg in args :
      if arg == '(' :
        stack.append('(')

      if arg == ')' :
        if not stack:
          flag = False
          break

        if stack[-1] != '(' :
          flag = False
          break
        stack.pop()

      if arg == '[' :
        stack.append('[')

      if arg == ']' :
        if not stack :
          flag = False
          break

        if stack[-1] != '[':
          flag = False
          break
        stack.pop()

    if len(stack) != 0 :
      flag = False
    return flag

  def get_num(args) :
    ans = 0

    while args :
      s = args.pop()

      if s == '(' or s == '[' :
        ans += get_num(args)
      
      if s == ')' :
        return 2 * max(1, ans)

      if s == ']' :
        return 3 * max(1, ans)

    return ans

  
  s = list(input().strip())
  
  if(is_good(s)) :  
    result = get_num(s[::-1])
    print(result)
    return

  print(0)
  return


BOJ2504()

 

풀이 접근 방법 :

1. 입력이 정상적인 괄호식인지를 먼저 체크한다.

2. 정상적인 입력일 때만 계산 하는 로직을 수행하게 된다.

3. 계산하는 로직에는 재귀함수를 사용하고 싶었다.

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

를 만날경우 

( 혹은 [ 를 만나면 재귀함수가 실행되는 형식이다.

) 혹은 ] 를 만났을때는 값을 리턴해주면 된다.

(()) 의 경우 함수는 총 두번 실행된다.

바깥의 ( 에서는 내부의 결과인 2를 가지고 있어야 한다.

이를 위해 현재 실행컨텍스트에서의 ans 변수는 재귀 함수의 결과값을 리턴 받아 자신의 값을 더하게 된다.

이 과정을 입력받은 괄호식의 전체를 순회할 때 까지 반복하게 된다.

 

 

https://www.acmicpc.net/problem/2504

 

2504번: 괄호의 값

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

www.acmicpc.net

 

'알고리즘' 카테고리의 다른 글

빙산 [백준 1062] - python  (0) 2022.03.27
빗물 [백준 14719] - python  (0) 2022.03.26
별자리 만들기 [백준 4386] - python  (0) 2022.03.24
전기가 부족해 [백준 10423] - python  (0) 2022.03.23
stack 두개로 queue 만들기  (0) 2022.03.22