본문 바로가기
Python3/백준 알고리즘

2022.02.22 [백준] (python 파이썬) 괄호의 값

by ian's coding 2022. 2. 22.
728x90
반응형

 

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

 

2504번: 괄호의 값

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

www.acmicpc.net


풀이

이 문제는 스택을 사용하여 푸는 문제이다. 왜냐하면 여는 괄호가 나오면 스택에 저장하고 닫는 괄호가 나오면 이전에 나왔던 여는 괄호와 비교를 해야하기 때문이다.

문제를 보고 고민을 하다가 도저히 방법이 생각이 안나서 구글링 후 해결하였다.

 

1. 여는 괄호가 나오면 stack에 담고 temp에 괄호가 ( 이면 2를 곱해주고 [ 이면 3을 곱해준다.

   이 때 temp의 초기값은 1로 해야한다. 이유는 0으로하면 곱해도 0이기 때문이다.

2. 닫는 괄호가 나오면 stack에 최근에 담긴 값과 비교하여 ) 일때 [ 이 나온다던가, ) 일때 [ 이 나오던가 stack이 비어있     으면 ans값을 0으로 변환 후 break를 이용해 for문을 빠져나온다.

3. 닫는 괄호가 나올때 닫는 괄호의 이전 값이 닫는 괄호와 짝이 맞으면 temp값을 ans에 더한다.

   이 후, temp를 해당 괄호에 해당하는 값으로 나눈 뒤, stack.pop한다. 

   temp값을 나누는 이유는 괄호가 안에 다른 괄호가 없이 닫힌 경우는 곱셈이 끝났기 때문에 해당 값을 저장 후, 나눠      준다. 이전의 값은 아직 나누지 않는 이유는 이전 괄호안에 다른 곱연산이 될 수도 있기 때문이다.(예시. (()[]) )

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
arr=list(input())
stack=[]
temp=1
ans=0
 
for i in range(len(arr)):
    if arr[i]=='(':
        stack.append('(')
        temp*=2
    elif arr[i]=='[':
        stack.append('[')
        temp*=3
    elif arr[i]==')':
        if not stack or stack[-1]=='[':
            ans=0
            break
        if arr[i-1]=='(':
            ans+=temp
        stack.pop()
        temp//=2
    elif arr[i]==']':
        if not stack or stack[-1]=='(':
            ans=0
            break
        # [()]의 경우 ] 직전 문자가 )이므로 더하지 않고 넘어감
        # 이유는 짝이 맞을 경우에만 해당 곱 연산이 끝난 것이기 때문에
        # 이전 문자와 짝이 맞을 경우에는 해당 연산이 모두 끝났기 때문에
        # temp값을 더해주고 괄호에 맞는 값을 temp에 나눠준다.
        if arr[i-1]=='[':
            ans+=temp
        stack.pop()
        temp//=3
if stack:
    ans=0
print(ans)
cs

해당 문제는 풀긴 풀었지만 구글링 후 다른사람의 코드를 보고나서 풀었기 때문에 다시 풀어봐야겠다...

 

 

 

728x90
반응형

댓글