LoginSignup
1
1

More than 5 years have passed since last update.

AtCoder B - A to Z String pythonで解いた際のメモ

Posted at

・B - A to Z Stringの問題のメモ
https://beta.atcoder.jp/contests/abc053/tasks/abc053_b

<問題の概要>
"QWERTYASDFZXCV"のようなランダムな文字列が与えられ、その中でAから始まってZから終わる部分を抜き出して、その間の文字数をカウントするということ。上の文字列の場合は"ASDFZ"が抜き取ることができ、その長さは5なので、それを表示するということ。

<自分の回答>

a = input()
b = ""
c=""
counterf=0
counter =0


for x in a:
    if x == "A":
        b+=x
        counterf +=1
    elif counterf >=1:
        b+=x

for x in b[::-1]:
    if x == "Z":
        c+=x
        counter+=1
    elif counter >=1:
        c+=x
print(len(c))

やり方は最初からAで始まる場所を探して抜き取る、そして文字列を逆から読み取ってZから始まる部分を抜き取るそしてA-Zの文字列を作るというもの。でもこのやり方はfor文を2回使う必要があり面倒だなと感じた、他の方の回答でいいと思ったのでメモしておく。

# -*- coding: utf-8 -*-

s = input()

print(s.rfind("Z") - s.find("A") + 1)

この方法は、findとrfindを使う方法
findは文字列を左から検索して該当の文字列が最初に検索ヒットする場所のインデックス(なんばんめの文字か)を検索してくれる。
rfindは右から検索してくれるだから、右からAの検索、左からZの検索をすればその間どのくらい文字列があるのかはわかるということ。

atoz = list(input())
A_num = 0
Z_num = 0
for i, j in enumerate(atoz):
    if j == "A" and A_num == 0:
        A_num = i + 1
    elif j == "Z" and A_num < i:
        Z_num = i + 1
    else:
        pass

print(Z_num - A_num+1)

これは関数のenumerateを使用する方法。
enumerateはiterator(今回だとリストに格納している)のそれぞれのオフセット番号とそれぞれの中身をタプルで返している。
それでそれぞれの番号でAが最初に見つかる→最初に見つかる場合
Zが最後に見つかるオフセットの番号→Zが出るたびに、その番号を上書きして更新すれば最終的に一番最後の番号が出る。
でもAが始まった後のZだけ見つけたいので、Aが見つかった場合に変数に1を足して、その変数が1以上ならその処理をするというif文を書けばいい。

<感想>
まだ関数型プログラムやオブジェクト指向型プログラミングや命令型プログラミングなど、様々なプログラミングの手法があるがまだどう違うのか理解できていない。それぞれ調べて意識しながらコードをかける様目指す。あとHTMLやCSSなどやりたい勉強もあるからそっちも手を抜かずに頑張ります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1