18日目のPythonアルゴリズム


今までに解いた問題の中で一番時間がかかったのではないでしょうか.头で论理的だけどうまく解けなかった.ずっと旅客ターミナルと衝突していたのでめちゃくちゃ^^...

9012:かっこ


1.最初の解答:失敗


あまり複雑に考えないで、簡単に行きましょう.豪気だから.壮烈に失敗の味を味わった.しかし壮絶なのはただ当然のことではありません...
import sys

N = int(sys.stdin.readline())
right = '('
left = ')'
for _ in range(N):
    input = sys.stdin.readline().strip()
    right_cnt = input.count(right)
    left_cnt = input.count(left)
    if right_cnt != left_cnt:
        print('NO')
    else:
        print('YES')
計算右かっこと左かっこの個数が同じであればYES~異なる場合はNO~
単純で愚かな考えだ.問題を解くときに反例をよく考えられなかったのは大きな問題だと思います.この解の反例.
) (
はい.はい.君がバカだと認める.だからこのように解かないで、違う方法で解かなければならないので、いろいろな方法で近づいてみましょう.

2.2番目の回答:成功


正~いろんな方法でYESが浮かび上がるところに近づいてきたNO…NOが出てくるはずの場所にYESが出てきました…^^
しかし、最後までやりぬくと決心したので、光栄な「正解」を得ました!満足する
import sys

N = int(sys.stdin.readline())
right = 0
left = 0
result = ''
for _ in range(N):
    input = list(sys.stdin.readline().strip())
    for i in range(len(input)):
        if input[i] == '(':
            right += 1
        else:
            left += 1
        if left > right:
            result = 'NO'
    if (result == ''):
        if (left == right):
            result = 'YES'
        else:
            result = 'NO'
    right, left = 0, 0
    print(result)
    result = ''
実は真ん中に注釈があります.すぐに諦めたい部分があります.
for i in range(1,len(input)):
        if (input[i-1]==right) and (input[i]==left):
           input[i-1], input[i] = 'True', 'True'
この問題を考えさせられたのは、()のVPSに遭遇したら、それをリストから削除することです.この過程を繰り返すと、また離れた((()()の()に出会えるので、これで解くと100%になります!!この考えが頭を支配した.しかし,この解答の問題は,for文のrangeが予め定められているため,最終的にindex errorが現れることである.index error... もううんざりだ.だから私は新しい方法で近づくべきだと思って、結果は成功した解答です!
成功した答えを思い出すポイントは、
どんな事が発生するに関わらず、“)”はすべて先に出てくることができません!
そうです.先に括弧が出たら何をしてもVPSにはならない今になってやっとこれを知った!
論理を説明すると
計算カッコの左右の変数を0に初期化します.右と左の
  • をそれぞれ数えて、左が右より大きいとしたら!!やったらすぐ結果にNOをつける
  • 回転が完了したら、結果は空の文字列ですか?この言葉の意味はrightがもっと大きいか、二つが同じです.
  • 二つの数が等しければVPS、
  • が違うと、VPSではないはずです.
  • 最後に保存した結果値を出力!
  • また、resultが空の文字列であるかどうかをチェックしていない場合は、左と右のVPSの合計のみが計算されます.つまり、この文字列が「()」であれば「」(「」であっても同じ左と右を持つとYESが出力されます.結果は最初の解と変わらないので…NOという文字列がresultに現在割り当てられているかどうかを判断する必要があります.
    ここまでは私の解答の説明ですが、今は他の解答を見てみましょう.

    3.その他の解釈

    a = int(input())
    for i in range(a):
        b = input()
        s = list(b)
        sum = 0
        for i in s:
            if i == '(':
                sum += 1
            elif i == ')':
                sum -= 1
            if sum < 0:
                print('NO')
                break
        if sum > 0:
            print('NO')
        elif sum == 0:
            print('YES')
    (出典:https://pacific-ocean.tistory.com/70)
    【リードID】頭がいいですね.数学的にこれに近づきたいなんて...うわっと感嘆するしかない.やっぱりもっと上達しなきゃ.
    今日も不思議なアルゴリズムの世界の果てです!