Swift教室 Swift と競技プログラミングの教室

コンテストの戦い方

読了目安 約3分

制約から解法を逆算し、サンプルを手で解いてから書く。WA チェックリストと ABC への挑み方。

この章の目次

道具は揃いました。 最後に、コンテストで問題と向き合う手順を型にします。

問題文は仕様書

問題文で確認する場所は 3 つです。

  • 入力形式: 何行目に何が来るか。読み取りのコードをここで決める
  • 制約: N や値の上限。使える解法を絞る手がかり
  • 入出力例: 仕様の具体例。自分の理解の答え合わせに使う

物語風の本文よりも、この 3 つが正確な情報源です。 解釈に迷ったら入出力例に戻ってください。

制約から解法を逆算する

解法はひらめきで探すものではなく、制約で絞り込むものです。 計算量 の目安と突き合わせます。

制約の目安間に合う計算量
N ≤ 20O(2^N)bit 全探索
N ≤ 3000O(N^2)二重ループ
N ≤ 2×10^5O(N log N)ソート
N ≤ 10^8O(N)一重ループ

単純な計算なら、1 秒あたり 10^8 回程度が目安です。

サンプルを手で解いてから書く

コードを書く前に、入出力例を 1 つ自分の手で解いてください。 手で解けない問題は、コードにもできません。 解き方を言葉で説明できたら、あとはそれを Swift に置き換えるだけです。

WA が出たときのチェックリスト

提出が WA (不正解) になったら、上から順に疑います。

  • 境界値: N = 1、値が 0、全部同じ値、で試したか
  • オーバーフロー: 掛け算の途中経過は Int に収まるか (数値型とオーバーフロー)
  • 出力形式: 改行・空白・大文字小文字は例と一致するか (YesYES は別物)
  • 読み違い: 「以上」「以下」「未満」を取り違えていないか

サンプルは合うのに 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
模範解答
Swift
let abc = readLine()!.split(separator: " ").map { Int($0)! }
if abc.contains(where: { $0 % 2 == 0 }) {
    print("Even")
} else {
    print("Odd")
}

積の偶奇だけが問われているので、掛け算そのものは不要です。 1 つでも偶数があれば積は偶数、全部奇数なら積も奇数です。 contains(where:) は「条件を満たす要素が 1 つでもあるか」を返す高階関数です。