IT recording...

[BOJ] 2504 괄호의 값 - python 본문

Algorithm

[BOJ] 2504 괄호의 값 - python

I-one 2021. 12. 15. 21:33

풀이

문제를 보자마자 stack을 사용해서 append시키고 pop시키고 해서 풀어야 할 것을 직감했다.
근데 계산된 결과를 어찌할 지 감을 못잡고 있다가 풀이를 보고 stck에 함께 넣어 관리하기로 하였다.
  1. 올바른 괄호가 아닌 경우를 먼제 제외하고 시작한다.
    (] 의 경우, [)의 경우, 그리고 ()끼리,[]끼리 개수가 같지 않을 경우가 있다.(쌍을 이루지 않는 경우)
  2. 들어온 것이 여는 괄호면 ( [ → stck에 그대로 append한다.
⇒ 여는 괄호는 스택에 넣어두고, 닫는 괄호가 나왔을 때 바로 앞에 있는 것과 짝이 맞을 때 진행한다.
⇒ 스택에 숫자를 함께 넣으므로 바로 앞에 있는 것이 숫자인 경우(그 앞의 부호를 다시 확인하여야 한다.), 여는 괄호인 경우를 나누어 진행한다.
⇒ 바로 앞이 숫자일 경우 → 그 앞의 것도 숫자이면 더하기 연산을 진행하고, 다시 연산을 진행해야 하므로 재귀시킨다. 그 앞의 것이 맞는 괄호인 경우 곱하기 연산을 진행한다.
⇒ 바로 앞이 여는 괄호인 경우 → 맞는 괄호이면 숫자를 stack에 넣는다.

코드

import sys

def input():
    return sys.stdin.readline().rstrip()

arr = input()

answer = 0
brackets = ["(",")","[","]"]
stck = []
brackets_dict = {"(":0,")":0,"[":0,"]":0}

for i,a in enumerate(arr):
    if i < len(arr)-1:
				# (] [) 의 경우 불가
        if (arr[i] == '(' and arr[i+1] == ']') or (arr[i] == '[' and arr[i+1] == ')'):
            print(0)
            exit()
    brackets_dict[a]+=1
#()끼리, []끼리 짝이 안맞을 경우
if not (brackets_dict["("] == brackets_dict[")"] and brackets_dict["["] == brackets_dict["]"]):
    print(0)
    exit()


def function(a,stck):
    if a == '(' or a == '[': #여는 괄호이면
        stck.append(a)
    else: #닫는 괄호이면
        if stck[-1] not in brackets: #숫자면
            if stck[-2] not in brackets: #두번째꺼도 숫자면
                stck.append(stck.pop() + stck.pop()) #더하기
                #stck.append(a)
                function(a,stck)
            else: #맞는 짝이면 해당 숫자
                if stck[-2] == '(' and a == ')':
                    f, s = stck.pop(), stck.pop()
                    stck.append(f * 2)
                elif stck[-2] == '[' and a == ']':
                    f, s = stck.pop(), stck.pop()
                    stck.append(f * 3)
        else: #숫자가 아니라 닫는 괄호 중 맞는 괄호면
            if stck[-1] == '(' and a == ')':
                stck.pop()
                stck.append(2)
            elif stck[-1] == '[' and a ==']':
                stck.pop()
                stck.append(3)

def isNumber(stck): #stck에 남아있는 것들이 숫자만 존재하는지 판별
    for s in stck:
        if s in brackets:
            return True
    return False

for a in arr:
    function(a,stck)

while isNumber(stck): #stck에 숫자만 남을 때까지 진행
    function(stck[-1],stck)

print(sum(stck))

얻어가는 것

  • runtime error (index error)
  • → list 인덱스 잘못 사용한 것이다. 경계값을 잘 사용했는지 다시 한 번 확인하기

느낀점

"211215"

소요 시간 : 2D 이상

  • 시험기간에 실버라 그래서 호기롭게 도전햇는데 젠장 조건이 꽤나 까다로웠다
  • 나의 머리로는 도저히 풀지 못하겠어서 풀이 봤는데 풀이가 더 어려워 세상에
  • 그래서 시험끝나고 재도전! 역시 머리를 비우고 풀어야한다

'Algorithm' 카테고리의 다른 글

[BOJ] 2904 수학은 너무 쉬워 - Java  (0) 2022.02.04
[BOJ] 2042 구간 합 구하기 - python  (0) 2021.12.21
[BOJ] 6416 트리인가? - python  (0) 2021.12.07
[BOJ] 1991 트리 순회 - python  (0) 2021.12.07
[BOJ] 10828 스택 - python  (0) 2021.12.06
Comments