[python]鉄棒


白峻10799号です。

問題の説明


何本もの鉄棒がレーザーで切らなければならない.効率的に動作するために、鉄棒を下から上へ重ね、上から垂直にレーザーを発射し、鉄棒を切断します.鉄棒とレーザーの配置は以下の条件を満たす:
鉄の棒は自分より長い鉄の棒にしか置けません.鉄棒を別の鉄棒の上に置くと、端点が重ならないように完全に含まれるように配置されます.
各鉄棒を切断するレーザー光は少なくとも1つ存在する.
レーザーはいかなる鉄棒の両端にも重ならない.
次の図は、上記の条件を満たす例を示しています.水平に描かれた太い実線は鉄棒で、点はレーザーの位置で、垂直に描かれた破線の矢印はレーザーの発射方向です.

これらのレーザーと鉄棒の配置は、括弧で左から右に順に表すことができます.
レーザーは、左かっこと右かっこの隣接するペア「()」として表されます.また、すべての「()」はレーザー光を表す必要があります.
鉄棒の左端は左かっこ「(」,右端は右かっこ「)」で表される.
前例のカッコは図に表されます.
鉄棒はレーザで数枚に切断され、上記の例では、最上位の2本の鉄棒はそれぞれ3枚と2枚に切断され、このようにして与えられた鉄棒は全部で17枚に切断された.
鉄棒とレーザーの配置を表す括弧が与えられた場合、切断された鉄棒片の総数を求めるプログラムを作成してください.

に答える


前に解答したかっこ題とあまり差がありません.
括弧の場合と同様にスタックを作成し、左括弧を入れ、右括弧を取り除きます.
ただここでindexは隣接する()がレーザであるため重要である.
1本の鉄棒をn個のレーザに分割し,n+1個の破片を生成した.
すなわち、レーザ光が発生するたびに、現在のスタックの長さが増加する.
右かっこが表示され、前のカッコの場合は=>レーザー
右かっこが次の右かっこの場合=>スチールロッドの端点
先ほどレーザーをn個に分けると破片がn+1個出ると言っていましたので、鉄棒の端に+1個加算されます.
これを繰り返すと結果値が出ます.

コミットコード

import sys
s = list(sys.stdin.readline().rstrip())
stack = []
result = 0

for i in range(len(s)):
    if s[i] == '(':
        stack.append(i)
    elif s[i] == ')':
        stack.pop()
        if s[i - 1] == '(':
            # 레이저
            result += len(stack)
        else:
            # 쇠막대기의 끝
            result += 1

print(result)