A – Leyland Number
解答
1 2 3 4 5 6 7 8 9 |
#map関数でリストやタプルなどが持つ全要素に別の関数を適用することができる #input関数は文字列型で値を受け取るので、int型にするためint第一引数において各要素に適用 #split関数は区切り文字を指定した上で文字列を分割し、リストで受け取る a, b = map(int, input().split()) #問題文で指定された計算を行い、変数answerに保持 answer = a**b + b**a #変数answerの値を出力 print(answer) |
split関数の使い方:要追記
B – Longest Palindrome
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#input関数で入力を受け取る s=input() #sの要素数を変数nに保持 n=len(s) #最も長い回文の長さを保持する変数を1で初期化 longest_parlindrome=1 #1文字目から最後の文字まで繰り返し処理 for i in range(n): #i+1文字目から最後の文字まで繰り返し処理 for j in range(i+1, n): #print(s[i:j+1],"s[i:j+1]") #print(s[i:j+1][::-1],"s[i:j+1][::-1]") #print("-------") #i番目からj+1番目までの文字列と、その反転した文字列が一致している=回文である場合 if s[i:j+1] == s[i:j+1][::-1]: #j+1番目からi番目までのインデックスを引いた数=回文となっている文字列の長さを保持 current_length = j+1-i #大きい方を解答用の変数に代入 longest_parlindrome = max(current_length, longest_parlindrome) print(longest_parlindrome) |
補足
for文の中での処理の流れを追うためにprintしてみた結果
1周目
外側のループでは1文字目からスタートする。
内側のループでは2文字目からスタートして、文字列を2,3,4・・・と1文字ずつ増やす。
内側のループでは、都度反転した文字列と一致するかを確認し、一致した場合はその文字列の数を変数に保持する。
内側のループで最後の文字まで到達すると、外側のループの2周目に入る。
2周目
外側のループでは2文字目からスタート
内側のループでは3文字目からスタートして、文字列を3,4,5と1文字ずつ増やす
以下繰り返し。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#入力例1 TO s[i:j+1] OT s[i:j+1][::-1] ------- TOY s[i:j+1] YOT s[i:j+1][::-1] ------- TOYO s[i:j+1] OYOT s[i:j+1][::-1] ------- TOYOT s[i:j+1] TOYOT s[i:j+1][::-1] ------- ・ ・ ・ #入力例2 AB s[i:j+1] BA s[i:j+1][::-1] ------- ABC s[i:j+1] CBA s[i:j+1][::-1] ------- ABCD s[i:j+1] DCBA s[i:j+1][::-1] ・ ・ ・ |
C – Slot Strategy 2 (Easy)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
m = int(input()) n = 3 S = [input() for i in range(n)] #ansに大きな値を保持 inf = 1e9 ans = inf #各リールの数字の数*リールの数だけループする for i in range(n*m): for j in range(n*m): for k in range(n*m): #[1] #各リールの数字の位置が全て異なり、3つのリールが全て同じ数字だった場合の処理 #[2] #S[1][i%m],S[1][j%m],S[2][k%m]:3つのリールが2周目以降で止まる可能性がある。 #入力例1の場合、2周目以降はi,j,kの値は10以上になるので、mで割った余りを求めて下一桁の値を取得することで各リールの数字の位置を取得する if i!=j and i!=k and j!=k and S[0][i%m] == S[1][j%m]==S[2][k%m]: #max(i,j,k):3つのリールの内、最後に止めたリールの秒数を取得 #現在の最短時間と、今回の探索で見つけた同じ数字で止めるまでの時間を比較し、時間が短い方をansに保持 ans = min(ans, max(i,j,k)) #ansがinfよりも小さい場合、3つのリールに同じ数字があったことを指す。 #ansがinfのままの場合、3つのリールに同じ数字がなかったため、永遠に止めることができない状態を指す。 #ansの値に応じて出力 print(ans if ans<inf else -1) |
最後に
久しぶりにAtcoderの問題を解きました。
力不足すぎる。
AtCoder Beginner Contest 解答・解説記事一覧
コメント