コンテストの戦い方
読了目安 約3分
制約から解法を逆算し、サンプルを手で解いてから書く。WA チェックリストと ABC への挑み方。
この章の目次
道具は揃いました。 最後に、コンテストで問題と向き合う手順を型にします。
問題文は仕様書
問題文で確認する場所は 3 つです。
- 入力形式: 何行目に何が来るか。読み取りのコードをここで決める
- 制約: N や値の上限。使える解法を絞る手がかり
- 入出力例: 仕様の具体例。自分の理解の答え合わせに使う
物語風の本文よりも、この 3 つが正確な情報源です。 解釈に迷ったら入出力例に戻ってください。
制約から解法を逆算する
解法はひらめきで探すものではなく、制約で絞り込むものです。 計算量 の目安と突き合わせます。
| 制約の目安 | 間に合う計算量 | 例 |
|---|---|---|
| N ≤ 20 | O(2^N) | bit 全探索 |
| N ≤ 3000 | O(N^2) | 二重ループ |
| N ≤ 2×10^5 | O(N log N) | ソート |
| N ≤ 10^8 | O(N) | 一重ループ |
単純な計算なら、1 秒あたり 10^8 回程度が目安です。
サンプルを手で解いてから書く
コードを書く前に、入出力例を 1 つ自分の手で解いてください。 手で解けない問題は、コードにもできません。 解き方を言葉で説明できたら、あとはそれを Swift に置き換えるだけです。
WA が出たときのチェックリスト
提出が WA (不正解) になったら、上から順に疑います。
- 境界値: N = 1、値が 0、全部同じ値、で試したか
- オーバーフロー: 掛け算の途中経過は
Intに収まるか (数値型とオーバーフロー) - 出力形式: 改行・空白・大文字小文字は例と一致するか (
YesとYESは別物) - 読み違い: 「以上」「以下」「未満」を取り違えていないか
サンプルは合うのに WA になる原因の多くは、境界値か制約の見落としです。
ABC の A・B 問題
AtCoder Beginner Contest (ABC) の問題は、A から順に難しくなります。 A 問題は文法どおりの実装、B 問題はループと条件分岐の組み合わせが中心です。 Part 1〜3 の内容で、この 2 つを解く道具は揃っています。
ここまでで APG4b 相当の内容は完了です。 腕試しには AtCoder Beginners Selection の 10 問がちょうどよい難易度です。 その先の典型アルゴリズムは Part 4 で扱います。
学びどころ
| 概念 | 一言まとめ |
|---|---|
| 問題文の読み方 | 入力形式・制約・入出力例が仕様 |
| 解法の選び方 | 制約 → 間に合う計算量 → 解法の順に絞る |
| 実装の前に | サンプルを手で解いて理解を確かめる |
| WA のとき | 境界値・オーバーフロー・出力形式・読み違いを順に疑う |
演習
総合問題です。
整数 A、B、C が 1 行に空白区切りで入力されます。
A × B × C が偶数なら Even、奇数なら Odd を出力してください。
制約: 1 ≤ A, B, C ≤ 10^9
そのまま掛けると、途中経過が Int に収まらない入力があります。
チェックリストの「オーバーフロー」を思い出してください。
入力例:
2 3 5
出力例:
Even模範解答
let abc = readLine()!.split(separator: " ").map { Int($0)! }
if abc.contains(where: { $0 % 2 == 0 }) {
print("Even")
} else {
print("Odd")
}積の偶奇だけが問われているので、掛け算そのものは不要です。
1 つでも偶数があれば積は偶数、全部奇数なら積も奇数です。
contains(where:) は「条件を満たす要素が 1 つでもあるか」を返す高階関数です。