백준 2504. 괄호의 값 (with. Python)

SSO·2022년 5월 24일

2504. 괄호의 값

🙄 쉬워보였는데 막상 문제 읽고 풀어보니까 멘부루붕붕

어느 지점에서 2나 3을 곱하고, 더해야하는 지가 생각하기 참 난감했다 ㅠㅠ 여기저기 풀이과정도 기웃기웃 보다가 그 지점을 알게 됐달까 ~ 🥰 (정말 당연하게도) 가장 애기 괄호가 끝나는 지점에서 여태까지 2나 3을 곱해오던 것을 더해주면 됐던 것! ('([....()...])' 요거 같이 젤 안 쪽에 있는 괄호를 애기 괄호라고 두었음) 또! 괄호를 닫을 때마다 2나 3을 다시 나눠줬다. 댑악😶

🎈 풀이

첫번째! 괄호를 리스트로 하나씩 받아온다!

두번째! 괄호의 종류에 따라 각 다른 케이스를 둔다. '(' ')' '[' ']' 이렇게 4가지가 될 것!

세번째! 케이스를 나눈다!
세번째-1 ! ( 나 [ 와 같이 열린 괄호가 들어올 경우?! 2나 3을 한 변수에 곱해주고 (변수 초기값은 1. 0이면 아무리 곱해도 0이니까~) 올바른 괄호 판단 알고리즘대로 stack에 append 해준다.
세번째-2 ! )나 ] 와 같이 닫힌 괄호가 들어올 경우?! 일단 stack이 비지는 않았는지, stack[-1]이 짝이 지어진 괄호가 맞는지 ('('의 짝은 ')', '['의 짝은 ']')를 먼저 체크한다. 여기서 틀리면 result=0 해주고 바로 break 🏳 ~! 맞으면 괄호가 닫혔으므로 2나 3을 다시 나눠주고, stack.pop() 해준다.

네번째! 닫힌괄호 앞의 괄호를 확인해보자!
세번째-2 전에 처리해줘야하는 과정이다. 만약에 닫힌 괄호가 들어왔고, 그 직전에 짝이 맞는 열린 괄호가 들어왔다면? 그 두 괄호는 쌍이 맞고 가장 안 쪽에 있으므로 애기 괄호가 된다. (예를 들면 () 또는 [] 순으로 들어왔을 때) 그럼 이 지점에서 result를 업데이트 해줘야 한다. 왜? 괄호의 한 케이스가 끝났으니까! 그니까 result += res 해줘버리자~

다섯번째! 결과를 출력하자!
위의 과정이 모든 과정이 끝났다. 그리고 이제 판단을 해보자. 일단 만약에, stack이 아직 비어있지 않다면..? 올바른 괄호가 아니라는 뜻! 0을 출력해주자.
stack도 잘 비어있으면? 올바른 괄호이므로 계산 결과를 출력해주자. result 출력하기!


🎈 코드

stack = [] # 스택
res = 1 # result에 더해주기 전 임시 변수
result = 0 # 결과 변수
p = list(input()) # 입력값

# 1~4번째 과정 시작
for i in range(len(p)):
  if p[i]=='(':
    res *= 2
    stack.append(p[i])
    
  elif p[i]=='[':
    res *= 3
    stack.append(p[i])
    
  elif p[i]==')':
    if not stack or stack[-1]!='(':
      result = 0
      break
    if p[i-1]=='(': result += res
    res //= 2
    stack.pop()
    
  elif p[i]==']':
    if not stack or stack[-1]!='[':
      result = 0
      break
    if p[i-1]=='[': result += res
    res //= 3
    stack.pop()


# 결과 출력
if stack:
  print(0)
else:
  print(result)

스택..! 좀 친해진 느낌이다 🥰

profile
쏘's 코딩·개발 일기장

1개의 댓글

comment-user-thumbnail
2023년 1월 18일

애기괄호.. 너무 비유찰떡인것 감사합니다. !

답글 달기