[2504] 괄호의 값
문제
기존 괄호 검사 문제의 응용버전인데 () = 2, [] = 3인데 (()) = 22 이며 [[]] = 33, [()[]] = (2+3) *3 일때 주어진 입력의 결과 값을 출력하면 된다. 올바르지 않은 괄호 배치이면 0을 출력한다.
코드
def inspection(arr):
stack = list()
ans = 0
tmp = 1
#분배법칙을 이용해서 기본저긍로 (,[를 만나면 2 or 3을 곱해가다가 () or [] 짝이 맞으면
# ans에 저장 후 pop and tmp //2 or tmp//3을 함
# return 0 이 되는 조건은 기존 괄호검사 로직과 같음
for j in range(len(arr)):
if arr[j] == '(':
tmp *= 2
stack.append('(')
elif arr[j] == '[':
tmp *= 3
stack.append('[')
elif arr[j] == ')' and (len(stack) == 0 or stack[-1] != '('):
return 0
elif arr[j] == ']' and (len(stack) == 0 or stack[-1] != '['):
return 0
if arr[j] == ')':
if arr[j - 1] == '(':
ans += tmp
stack.pop()
tmp //= 2
elif arr[j] == ']':
if arr[j - 1] == '[':
ans += tmp
stack.pop()
tmp //= 3
if len(stack) != 0:
return 0
else:
return ans
print(inspection(input()))
설명
[()[]] 일때 이것을 (2+3)*3으로 계산하려고 한다면 코드가 매우 복잡해진다. 분배 법칙을 이용해야 문제풀이가 용이하다. [()[]]을 (2+3)*3 이 아닌 3*2+3*3 으로 계산을 해야한다. 그렇기 때문에 먼저 (,[을 만나면 tmp에 2 or 3을 곱해주다가 ),]을 만나는데 바로 직전의 문자와 서로 짝이 맞다면 ans에 저장해주고 스택을 팝해주며 2 or 3으로 나누어준다. 0을 반환해주는 조건은 문자열이 끝났는데 스택이 비어있지 않거나 스택이 비었는데 )나 ]가 입력인 경우, 서로 짝이 맞지 않는 경우이다.
Author And Source
이 문제에 관하여([2504] 괄호의 값), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@deankang97/백준-2504-괄호의-값저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)