【Atcoder】ABC320振り返りA問題~C問題【Python】
Atcoderの記事だニャ
A問題
正整数A,Bが与えられます。
AB+BAの値を出力してください。
解答
pythonで累乗の演算子は**です。
A, B = map(int, input().split()) print(A**B + B**A)
B問題
文字列 S が与えられます。
S の連続する部分文字列のうち、回文であるものの長さの最大値を求めてください。
ただし、S の連続する部分文字列であって回文であるものは常に存在します。
解答
回文の問題では与えられた文字列を反転させて一致したら回文である、という手段がよく用いられます。
S = input() n = len(S) SS = S[::-1] ans = 1
SSという変数に反転させた文字列を格納しました。
[::-1]で反転できるということは知っておいて損はないと思います。
この後、与えられた文字列(TOYOTAとします)の2文字以上の部分文字列をすべて検証します。
TO、TOY、TOYO、TOYOT、TOYOTA、OY、OYO、OYOT、…みたいな感じです。
方法は、for文で1文字目を固定します。
そしてfor文を入れ子にして、部分文字列の最後の文字を指定します。
for i in range(n-1): for j in range(i+1, n): if S[i:j] == SS[-j-1:-i-1]: ans = max(ans, j-i+1)
i = 2、j = 4のとき、S[i:j]は'YOT'を表します。
反転させた文字列(SS)の同じ部分と一致していたら回文と判定します。
ansには前回のループまでの回文と今回判明した回文の文字数の多い方を格納します。
全コード
S = input() n = len(S) SS = S[::-1] ans = 1 for i in range(n-1): for j in range(i+1, n): if S[i:j] == SS[-j-1:-i-1]: ans = max(ans, j-i+1) print(ans)
C問題
3個のリール(回る部分)があるスロットがあります。
各リールはM文字のSiという配列です。
0秒から1秒に1回リールを止めることができるとき、最速で何秒でスロットをそろえることができますか。
スロットをそろえることが不可能な場合-1を出力してください。
解答
リールの文字列を文字列として扱います。
M = int(input()) S1 = str(input())*3 S2 = str(input())*3 S3 = str(input())*3 l = []
たとえば、3つのリールの文字列の最後の文字でスロットがそろうとします。
1秒に1回しか止められないので、1周目にS1を止め2周目にS2を止め3周目にS3を止めるといった具合で、最大で3周分スロットを回さなくてはなりません。
なので各配列を3回ループさせています。
その後、すべての組み合わせで検証します。
for i in range(M*3): for j in range(M*3): if i == j: continue if S1[i] == S2[j]: for k in range(M*3): if i == k or j == k: continue if S1[i] == S3[k]: ans = max(i, j, k) l.append(ans)
S1のi番目とS2のj番目が一致したらS3を検証します。
ただし1秒間で1回しか止められないので、iとjとkがそれぞれ同じ数字にならないように注意します。
S1[i] == S2[j] == S3[k]となったとき、i、j、kで最大の物(=かかった時間)をリストに追加します。
最後にリストの長さが0なら-1を出力して、0でなかったらリストの中の最小値を出力します。
全コード
M = int(input()) S1 = str(input())*3 S2 = str(input())*3 S3 = str(input())*3 l = [] for i in range(M*3): for j in range(M*3): if i == j: continue if S1[i] == S2[j]: for k in range(M*3): if i == k or j == k: continue if S1[i] == S3[k]: ans = max(i, j, k) l.append(ans) if len(l) == 0: print(-1) else: print(min(l))
SNSで感想をシェアしてね↓