見出し画像

[ABC281 Python]AtCoder Beginner Contest 281 A~C問題Python解説

いつもご覧いただきありがとうございます。
ABC281の解説記事です。
ミス等ありましたら、コメントにてご連絡ください。

A問題

N = int(input())
for i in range(N+1):
    print(N-i)

0~Nまでの整数を大きい順に出力する問題です。
いろいろ考え方はありますが、
自分はNから0~Nまでの整数を引くことで導きました。

B問題

S = input()

if len(S) != 8:
    print("No")
elif S[0].isupper() == False or S[-1].isupper() == False:
    print("No")
elif S[1:7].isdigit() == False:
    print("No")
elif 1 <= int(s[1):
    print("Yes")
else:
    print("No")

条件を順番に確認していけば、問題なく解くことができるでしょう。
問題文を整理すると、条件を満たす文字列は
①1文字目が英大文字
②2文字目から7文字目までが10000以上999999以下の整数
③8文字目が英大文字
④Sの長さが6
ですね。

これを順番に見ていけばいいのですが、
1つ注意が必要なのは、見ていく順番です。
例えば、Sの長さが1の場合、
既に④を満たさないのでNoになりますが、
①から見ていったときに、②でエラーが出てしまいます。
エラーではなく、Noと返すためには、
④を必ず最初に見ておく必要がありますね。

では実際に確認していきましょう。
④Sの長さが6
これは問題ないですね。長さはlen(S)で求めることができます。

①1文字目が英大文字、③8文字目が英大文字
該当する文字が英大文字かどうかについては、
Pythonでは以下の組み込み関数がありますので、
それを使うと判定することができます。

②2文字目から7文字目までが10000以上999999以下の整数
これは2つの事項を確認する必要があります。
1つ目は2文字目から7文字目までの文字列が整数で表すことができるのか、もう1つはその文字列(整数)が10000以上99999以下か、です。
前者は先ほどと同様に組み込み関数で判定しましょう。

後者は単純に範囲内かどうかを判定するだけで大丈夫です。

ということで、①~④をすべて満たせばYes、それ以外はNoと出力します。

C問題

N, T = map(int, input().split())
A = list(map(int, input().split()))

sum_A = sum(A)
re = T%sum_A
for i in range(N):
    if A[i] > re:
        print(i+1, re)
        break
    else:
        re = re-A[i]

制約が大きいので、全ての曲を流すとTLEになるので工夫が必要です。

考え方を説明します。
入力値によっては、プレイリストを何周もする場合があります。
ただ、欲しい情報としては、T秒後にどの曲が流れているのか、
その曲の何秒の地点が流れているかなので、
プレイリストが何周しようが関係ありません。

なので、T秒のうちプレイリストを周回している部分については一気に削除したいですね。
プレイリストを周回するにはsum(A)秒かかるので、Tをsum(A)で割った余りを変数reに保存します。
reはsum(A)より小さいので、プレイリストのどこかで、必ず止まります。
こうなってから、曲を再生していきましょう。

具体的には次の曲(最初は先頭の曲)の秒数を見て、
1曲すべて流せそうだったら、次の曲に行きます。
1曲すべて流すので、残り時間はre-A[i]となります。
もし流せそうじゃなかったら、その曲が何番目なのか、何秒まで流せるのかを出力しましょう。

この記事が気に入ったらサポートをしてみませんか?