Data Structure/Stack

[백준 2504번] 괄호의 값

킹우현 2023. 10. 18. 18:29

 

2504번: 괄호의 값

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

www.acmicpc.net

string = list(input())

stack =[]

expression = ""

for i,value in enumerate(string):

    if not (value == '(' or value == ')' or value=='[' or value == ']'): # 괄호나 대괄호가 아닌 경우 예외처리
        print(0)
        exit(0)
    
    if value == '(' or value == '[': # 여는 괄호일 경우 스택에 넣고 표현식 열기
        stack.append(value)
        expression += '('
    else: # 닫는 괄호일 경우
        if not stack: # 닫을 괄호가 없는 경우 예외처리
            print(0)
            exit(0)
        if value == ')': # 닫는 괄호가 소괄호이고
            if stack[-1] == '[': # 스택의 마지막 원소가 일치하지 않으면 예외처리
                print(0)
                exit(0)
            if string[i-1] == '(': # ()이면 2를 반환하기 위해 곧바로 닫아줌
                expression += '2)'
                if i+1 < len(string) and (string[i+1] == '(' or string[i+1] =='['): # 다음 식이 새로운 식이라면 + 처리
                    expression += '+' 
            else: # (X)인 경우 X2 처리
                expression += ')*2'
                if i+1 < len(string) and (string[i+1] == '(' or string[i+1] =='['): # 다음 식이 새로운 식이라면 + 처리
                    expression += '+' 
            stack.pop() # 닫음과 동시에 스택 pop
    
        if value == ']': # 닫는 괄호가 대괄호이고
            if stack[-1] == '(': # 스택의 마지막 원소가 일치하지 않으면 예외처리
                print(0)
                exit(0)
            if string[i-1] == '[': # []이면 3을 반환하기 위해 곧바로 닫아줌
                expression += '3)'
                if i+1 < len(string) and (string[i+1] == '(' or string[i+1] == '['): # 다음 식이 새로운 식이라면 + 처리
                    expression += '+'
            else: # (X)인 경우 X3 처리
                expression += ')*3'
                if i+1 < len(string) and (string[i+1] == '(' or string[i+1] =='['): # 다음 식이 새로운 식이라면 + 처리
                    expression += '+' 
            stack.pop() # 닫음과 동시에 스택 pop

if stack: # 모든 과정이 끝나고도 스택이 남아있는 경우 남아있는 괄호가 있으므로 예외처리
    print(0)
    exit(0)

print(eval(expression))

이번 문제는 주어진 괄호가 ()은 2, []은 3, (X) [X]처럼 감싸는 경우는 *2, *3, 괄호열이 연속된 경우에는 + 해준다고 가정했을 때, 괄호열의 값을 나타내는 문제이다.

 

처음에 어떻게 풀까 고민하다가, 모든 괄호의 경우의 수를 나눠서 계산식(expression)에 추가해주고 마지막에 eval 함수를 사용하여 계산해준 값을 출력해주었다. 나머지는 괄호 문제에서 봤던 예외처리와 동일하게 처리해주었다.

 

Stack 자료구조를 사용하여 풀 수 있었던 좋은 문제였다 :)

 

 

'Data Structure > Stack' 카테고리의 다른 글

[백준 9935번] 문자열 폭발  (0) 2023.10.18
[백준 2812번] 크게 만들기  (0) 2023.10.18
[백준 10799번] 쇠막대기  (1) 2023.10.18
[백준 4949번] 균형잡힌 세상  (0) 2023.10.18
[백준 9012번] 괄호  (1) 2023.10.18