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 = 1 と N = 125 が4、N = 126 と N = 211 が6、N = 212 と N = 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_i と B_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進数として表示します。04d の 4 は表示幅、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 では 0000、N = 1 では 0001、N = 321 では 0321、N = 9999 では 9999 になります。
自分で解くときのチェック
intへ変換した後でも、出力は数値ではなく4桁の文字列にする。- 公式例の321、7777、1を無加工で実行し、0321、7777、0001を照合する。
- 0と9999を境界として、桁数が4文字になることを確認する。
ABC244 Aで文字列の末尾を取り出す
見分ける言葉
ABC244 Aの問題文は、長さNの英小文字列Sから末尾の1文字を出力させます。公式解説も、Sを受け取って末尾の文字を出力する方針を示しています。末尾の位置だけが必要なら、文字列の長さから位置を計算するより、Pythonの負の添字 -1 を使います。
小さい追跡例
N = 5、S = abcde のとき、文字は左から a、b、c、d、e と並びます。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 = 1 で S = a なら a を出力し、Nが1000でも -1 は末尾を指します。Sは英小文字だけで長さNという制約を前提にします。
自分で解くときのチェック
- 入力Nを読んでから、次の行のSを読む。
- 公式制約でNが1以上であることを確認し、空文字列を想定した例外回避を追加しない。
- 公式サンプルの
5 abcdeと1 aを無加工で実行し、eとaを照合する。
問題文の条件から実装を選ぶ
実際にA問題を読むときは、まず答えが範囲で分かれるか、同じ入力処理を繰り返すか、表示桁数をそろえるか、文字列の特定位置を取り出すかを確認します。条件分岐なら境界を小さい順に並べ、繰り返しなら1回分の処理をループに置き、固定桁なら表示形式を指定し、末尾なら -1 を使うと、問題文の条件とコードの役割が対応します。
次に学ぶ
次に、境界をどこで切るか、状態をどの順番で更新するか、候補をどう全て試すかを学びたいときは、次の記事へ進みます。






