[BOJ]鉄棒(スタック)


資料構造でよく使われるスタックを使用する標準的な問題を解いた.
これは括弧(Valid PS)の問題に似た括弧に関する問題であり,この問題の解答を書いてみる.

🧐 問題分析と実施要素


以下は問題の全体的な説明です.

資料の構造方式は,前に解いた括弧問題と類似しており,閉じた括弧()に遭遇した場合に計算が行われるため,最初にスタックを使用することにしたが,簡単な解答を考えればそれほど困難ではないはずである.
問題の説明を読んで、いくつかの注意点を計算する方法と、括弧に基づいて置かれた(入力された)鉄棒の数(出力)を説明します.まず,カッコの配列に基づいてレーザと鉄棒を区別する方法を知る必要がある.
レーザーと鉄棒の見分け方は以下の通りです.
  • レーザは、左かっこと右かっこの隣接対「()」として表現される.また、すべての「()」はレーザー光を表す必要があります.
  • (重要!)鉄棒の左端は左括弧"(",右端")で表します.
  • このような区分方式と上記のいくつかの補足説明に従って、私は4つの必要条件を考慮してメモしました.
  • ()こそレーザーを意味するので、遭遇(さらに)した場合は、手前の棒()の個数によってカットします.
  • ()がもう1つ現れると、これはレーザではなく棒の末端を意味する.このときを区別するコードを入れるべきです.
    2-1 . 棒の端にぶつかると、棒はもう使わないので、+1万を追加します.
  • の棒全体の切断個数を計算し、変数に入れます.
  • ここで最も悩んでいるのは、レーザー出力後、棒の末端が出てきたら、それをどのように区別するかです.
    普段はリストのインデックスを使って値にアクセスすることが多いので、リストのインデックスを考えてコードを書きますが、Out rangeエラーが頻繁に発生し、結局インデックス機能を放棄し、最初から書き直すことにしました.

    📗 Programming


    💻 Main

    import sys 
    
    stack = []
    result = 0
    chg = 0			# 여는 괄호, 닫는 괄호에 따라 상태를 저장해줄 변수.
    
    for i in sys.stdin.readline().strip():
        if i == '(':
            stack.append('(')
            chg = 1			# 여는 괄호가 입력되면 chg 변수의 값을 1로 변경.
            
        if i == ')':
            if chg == 1:
                stack.pop()
                result += len(stack)
                chg = 0			# 닫는 괄호가 입력되면 chg 변수의 값을 0으로 변경.
            elif chg == 0:
                stack.pop()
                result += 1
                
    print(result)
    一番考えさせられる部分は、レーザーで棒の先端が現れる場合("(")").
    棒の末端に1を付ける部分には、インデックスメソッドを使用して変数を割り当てて変数の値を交換するよりも、前のカッコの状態値が必要です.