오늘의 삽질로그 (2504번)

개발새발log·2022년 4월 19일
0

백준

목록 보기
1/36

색다르게 이 한 문제에서 마주친 삽질을 기록하면 어떨까 싶어서 적어봅니다 일명 TIL을 가장한 삽질로그! (무려 두세시간 가량을 잡아먹은..)

파이썬을 활용한 문제 풀이입니다

문제: 2504. 괄호의값

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

대표적인 스택 유형 문제다.

다만, 주어진 괄호가 올바른 괄호냐 아니냐까지는 누구나 쉽게 생각하지만, 중간중간 값을 어떤 식으로 저장하냐가 관건일듯! 생각해야 할 반례도 많고 까다로운 문제다.

나는 하나의 스택에 괄호와 계산한 결과를 같이 넣는 방식으로 풀었다.

삽질 남바원

if b == '(' or '[':
ㅎ뭐가 틀렸게요....? 놀랍게도 아무 생각없이 저렇게 적어서 처음에 스택이 하도 이상하게 작동하길래 뭔가 싶었다

삽질 남바투

typeerror: 'str' object is not callable
typeerror: 'int' object is not callable
(놀랍게도 오늘 이거 둘 다 봤다!)

이런 게 뜬다는 건... 너가 그 어딘가 예약어를 변수명으로 썼다는 것..
ㄱㅣ억해..⭐️

삽질 남바쓰리: aka. 반례파티

여기서부턴 자강두천 반례 싸움이였다..🔥 고려해야 될 반례가 너무 많아서 다 적을 순 없을 거 같다.

내가 걸렸던 건 '()([]', '[]]' 이런 테스트케이스들이였다.

이 분 답변 참고하시면 도움될 거 같네요..!!
(반례 화수분이여서 너무 감사했습니다🙇‍♀️
👉 https://www.acmicpc.net/board/view/30310

최종 코드

bracket_str = input()

def get_bracket_val(string):
    stack = []
    bracket_val = 0
    
    for b in string:
        if b == '(' or b == '[':
            stack.append(b)
        else:
            if not stack: return 0
            if b == ')':
                if stack[-1] == '(':
                    stack.pop()
                    stack.append('2')
                elif stack[-1] == '[': return 0
                elif stack[-1].isdigit(): 
                    total = 0
                    while stack and stack[-1].isdigit():
                        total += int(stack.pop())
                    if not stack: return 0
                    if stack[-1] == '(':
                        stack.pop()
                        push_val = total * 2
                        stack.append(str(push_val))
                    elif stack[-1] == '[': return 0
            else: #b == ']'
                if stack[-1] == '[':
                    stack.pop()
                    stack.append('3')
                elif stack[-1] == '(': return 0
                elif stack[-1].isdigit(): 
                    total = 0
                    while stack and stack[-1].isdigit():
                        total += int(stack.pop())
                    if not stack: return 0
                    if stack[-1] == '[':
                        stack.pop()
                        push_val = total * 3
                        stack.append(str(push_val))
                    elif stack[-1] == '(': return 0
    
    for x in stack:
        if x.isdigit(): bracket_val += int(x)
        else: return 0
        
    return bracket_val

print(get_bracket_val(bracket_str))
profile
⚠️ 주인장의 머릿속을 닮아 두서 없음 주의 ⚠️

0개의 댓글