AtCoder A問題の解き方をPythonで学ぶ|条件分岐・繰り返し・文字列の4問

読了 約10分 たびすけ
AtCoder A問題の条件分岐・繰り返し・ゼロ埋め・末尾取得を示す4分割図

次に読む記事

関連するテーマの記事を、先に確認できます。

AtCoderのA問題で実装に迷ったら、問題文が示す入力と答えの関係を先に見ます。範囲ごとに答えが決まるなら条件分岐、同じ形の入力を決まった回数だけ処理するなら繰り返し、表示する桁数が決まっているならゼロ埋め、文字列の末尾だけが必要なら負の添字を選びます。

この順番で、ABC214 A、ABC288 A、ABC222 A、ABC244 Aを一問ずつ追います。各問題で、見分ける言葉、小さい追跡例、完全なPythonコード、コードが正しい理由、計算量と境界、自分で解くときのチェックを確認します。四問の並びは、四つの実装を見分けやすくするための説明順です。

問題文で見る言葉選ぶ実装扱う問題
範囲ごとに答えが決まる条件分岐ABC214 A
同じ形の入力がN個ある繰り返しABC288 A
決まった桁数で表示するゼロ埋めABC222 A
末尾の1文字を求める負の添字ABC244 A

ABC214 Aで境界を条件分岐にする

見分ける言葉

ABC214 Aの問題文には、Nの範囲ごとに出力する問題数が書かれています。公式解説も、Nが125以下なら4、211以下なら6、それ以外なら8を出力するif文の方針を示しています。問題文に「A以下ならB、次の範囲ならC」のような境界が並んでいたら、境界の小さい順に条件を置きます。

小さい追跡例

N = 126を入力すると、最初の条件 126 <= 125 は偽です。そのため4を出力する分岐には入らず、続く 126 <= 211 が真になって6を出力します。境界126は、最初の範囲ではなく二つ目の範囲に入ることが分かります。

完全なPythonコード

n = int(input())
if n <= 125:
    print(4)
elif n <= 211:
    print(6)
else:
    print(8)

なぜ正しいか

制約内のNは、1から125、126から211、212から214のいずれか一つの範囲に入ります。最初の if が真ならNは1から125なので4を出力し、そこが偽で elif が真ならNは126から211なので6を出力します。両方が偽なら残る212から214なので8を出力します。最初に真になった分岐だけを実行するため、対応する問題数を一度だけ出力できます。

計算量と境界

比較の回数はNの大きさに依存しないため、計算量は O(1)、追加メモリも O(1) です。境界では N = 1N = 125 が4、N = 126N = 211 が6、N = 212N = 214 が8になります。

自分で解くときのチェック

  • 問題文の区間の端点を、比較条件へそのまま対応させる。
  • elif は、最初の条件が偽になった範囲だけを受け持つと確認する。
  • 公式入力の214、1、126をコードへ無加工で与え、8、4、6になることを確かめる。

ABC288 Aで同じ処理を繰り返す

見分ける言葉

ABC288 Aの問題文は、N個の整数の組 (A_i, B_i) について、それぞれの和を出力させます。公式解説が示すように、最初にNを読み、同じ読み取りと加算をN回繰り返します。「各組について」「N行出力する」のように同じ形の入力が続くなら、1組を処理する手順をループの本体にします。

小さい追跡例

N = 3で、続く組が (3, 5)(2, -6)(-5, 0) だとします。

  • 1回目は (3, 5) を読み、3 + 5 = 8 を出力する。
  • 2回目は (2, -6) を読み、2 + (-6) = -4 を出力する。
  • 3回目は (-5, 0) を読み、-5 + 0 = -5 を出力する。

1回のループが入力1組と出力1行に対応し、Nが3なので3回で終わります。

完全なPythonコード

n = int(input())
for _ in range(n):
    a, b = map(int, input().split())
    print(a + b)

なぜ正しいか

range(n)は0からN-1までのN個の値を作るため、ループ本体は入力の組ごとにちょうどN回実行されます。各回で1組だけを読み、その組の a + b をすぐ出力するので、入力順を保ったN行の答えになります。入力値が負でも、整数の加算結果をそのまま出力できます。

計算量と境界

N組を一度ずつ読み、各組を定数回の加算と出力で処理するため、計算量は O(N) です。入力全体を保存せず1組ずつ処理するので、追加メモリは O(1) です。N = 1 では1回だけ実行し、N = 1000 では1000回実行します。A_iB_i はそれぞれ -109 以上109 以下の範囲で読みます。

自分で解くときのチェック

  • 最初のNを、ループ回数を決めるためだけに使う。
  • 各反復で入力を1組読み、出力を1行出す対応を崩さない。
  • 公式サンプルの4組を無加工で実行し、負数と大きな整数の和を照合する。

ABC222 Aで表示を4桁にそろえる

見分ける言葉

ABC222 Aの問題文は、0以上9999以下の整数を4桁の文字列として出力させます。公式解説も、Pythonでは f"{N:04d}" の書式指定を使うコードを示しています。数値を計算する問題ではなく、先頭の0を含む表示形式が答えになる問題です。

小さい追跡例

N = 1 は数値としては1桁ですが、幅4の10進数として表示します。04d4 は表示幅、0 は不足分を埋める文字、d は10進数を表すため、左側に3個の0が補われて 0001 になります。

完全なPythonコード

n = int(input())
print(f"{n:04d}")

なぜ正しいか

04d はNを10進数で表示し、幅4に足りない分を左側の0で埋めます。制約内のNは9999以下なので4桁を超えて切り捨てる必要がなく、N=0を含めて常に4文字の出力になります。したがって、問題が求める固定桁の文字列をそのまま出力できます。

計算量と境界

入力範囲と出力幅が固定されているため、計算量は O(1)、追加メモリも O(1) です。N = 0 では 0000N = 1 では 0001N = 321 では 0321N = 9999 では 9999 になります。

自分で解くときのチェック

  • int へ変換した後でも、出力は数値ではなく4桁の文字列にする。
  • 公式例の321、7777、1を無加工で実行し、0321、7777、0001を照合する。
  • 0と9999を境界として、桁数が4文字になることを確認する。

ABC244 Aで文字列の末尾を取り出す

見分ける言葉

ABC244 Aの問題文は、長さNの英小文字列Sから末尾の1文字を出力させます。公式解説も、Sを受け取って末尾の文字を出力する方針を示しています。末尾の位置だけが必要なら、文字列の長さから位置を計算するより、Pythonの負の添字 -1 を使います。

小さい追跡例

N = 5S = abcde のとき、文字は左から abcde と並びます。S[-1] は末尾から1文字目を指すため、長さを使って S[N - 1] を計算しなくても e を選べます。

完全なPythonコード

n = int(input())
s = input()
print(s[-1])

なぜ正しいか

公式の制約はNが1以上なので、Sは空文字列ではなく S[-1] は必ず存在します。Pythonの負の添字 -1 は文字列の末尾の文字を表すため、Sの長さに関係なく問題が求める1文字を出力できます。最初にNを読むのは、問題の入力形式に従って次の行のSを受け取るためです。

計算量と境界

入力文字列を読む時間を含む計算量は O(N) です。Sを保持する追加メモリは O(N) で、末尾の添字取得自体は O(1) です。N = 1S = a なら a を出力し、Nが1000でも -1 は末尾を指します。Sは英小文字だけで長さNという制約を前提にします。

自分で解くときのチェック

  • 入力Nを読んでから、次の行のSを読む。
  • 公式制約でNが1以上であることを確認し、空文字列を想定した例外回避を追加しない。
  • 公式サンプルの 5 abcde1 a を無加工で実行し、eとaを照合する。

問題文の条件から実装を選ぶ

実際にA問題を読むときは、まず答えが範囲で分かれるか、同じ入力処理を繰り返すか、表示桁数をそろえるか、文字列の特定位置を取り出すかを確認します。条件分岐なら境界を小さい順に並べ、繰り返しなら1回分の処理をループに置き、固定桁なら表示形式を指定し、末尾なら -1 を使うと、問題文の条件とコードの役割が対応します。

次に学ぶ

次に、境界をどこで切るか、状態をどの順番で更新するか、候補をどう全て試すかを学びたいときは、次の記事へ進みます。