[Baekjoon]2504-かっこの値stack(Python)


[Baekjoon]2504-かっこの値(スタック)

🧐 問題の説明



😍 私の答え


括弧の問題はスタックです!!プログラマーの中でスタックを使った括弧の問題をいくつか解いたので簡単だと思いますが、例外が多すぎて解決しにくいです.
まずスタックの特徴を考慮して問題に近づく.
入力例((()[[]])([])をスタック構造として表します.
1. ( ), [ ] 가 올바른 괄호쌍이 되면 스택에서 빠져나온다.

2. pop 하면서 ( )는 2, [ ]는 3의 값을 스택에 다시 삽입한다.

3-1. 만약 괄호 안에 숫자가 들어 있으면 
그 값을 (N)은 N x 2, [N]은 N x 3한다.

3-2. 괄호 안에 숫자가 여러개 들어 있으면
숫자들을 더하고 3-1의 곱 연산을 한다.

4. 이 과정을 입력받는 괄호가 끝날 때까지 반복한다.
基本スタックの使用はそうであるが,実際の問題では演算を実行する方法や例外を考慮することはかなり困難である.実行中にかなりのエラーが発生しました.🤣
  • 複数の括弧"(","[)がスタックに格納されます.
  • の括弧は「」、「」の2つに分けられます.
  • 💡 두 닫는 괄호의 차이점은 
    연산을 x 2 하느냐, x 3 하느냐의 차이고 논리는 동일하다.
  • それぞれの場合、スタックの最上位要素(TOP)が処理されることを確認する.
  • 💡 이 때, 스택의 원소가 없다면 최상단 원소를 확인하는 경우 Error가 발생한다. 
    if stack and stack[-1]~ 과 같이 인덱스 오류를 피하도록 코딩해야 한다.
  • 3の論理過程において、対にならない括弧がある場合、()を終了する.
    また、すべてのプロシージャを実行するときにスタックにカッコが残っている場合、exit()は0を出力します.
  • はすべてのプロセスを完了し、スタックに数字しかない場合、スタックに残っている数字と答えです.
  • s = list(input())
    stack = []
    
    for i in s:
        if i in ['(', '[']: # 여는 괄호는 전부 스택에 저장
            stack.append(i)
    
        elif i == ')':  # 닫는 괄호가 ')'인 경우
            tmp = 0
    
            while True:
                if not stack:
                    print(0)
                    exit()
    
                if stack and stack[-1] == '(': # 올바른 괄호 짝짓기 성공
                    stack.pop()
                    if tmp == 0:    # 연산이 진행중이던 게 없으면 그냥 2 ex. ()
                        stack.append(2)
                    else:   # (()) 같은 케이스
                        stack.append(2 * tmp)
                    break
    
                elif stack and stack[-1] == '[':    # 올바르지 않은 괄호
                    print(0)
                    exit()
    
                else:
                    tmp += int(stack.pop())
    
        elif i == ']':  # 닫는 괄호가 ']'인 경우
            tmp = 0
    
            while True:
                if not stack:
                    print(0)
                    exit()
    
                if stack and stack[-1] == '[':
                    stack.pop()
                    if tmp == 0:
                        stack.append(3)
                    else:
                        stack.append(3 * tmp)
                    break
    
                elif stack and stack[-1] == '(':
                    print(0)
                    exit()
    
                else:
                    tmp += int(stack.pop())
    
    
    for i in stack:
        if i in ['(', ')', '[', ']']:   # 짝짓는 걸 끝마쳤는데 스택에 괄호가 남아있다면 올바르지 않은 괄호
            print(0)
            exit()
    else:
        print(sum(stack))