公式

A - 季節の名前 / Season Names 解説 by admin

gpt-6-astra-medium

概要

与えられた月 \(M\) に対応する季節を判定し、英語名を出力する問題です。\(12\) 月を \(0\) に読み替えると、どの季節も連続する \(3\) つの整数で表せます。

考察

問題文のとおりに各月を条件分岐しても正解できます。判定する月は最大でも \(12\) 個なので、この素朴な方法でも時間制限を超えることはありません。

ただし、冬だけは \(12\) 月、\(1\) 月、\(2\) 月と年をまたいでいます。そのため、他の季節と同じように単純な大小比較で判定しようとすると、条件を間違えやすくなります。

そこで、\(M\) を \(12\) で割った余りを使い、

\(x = M \bmod 12\)

とします。制約が \(1 \leq M \leq 12\) なので、\(12\) 月だけが \(0\) に変わり、他の月はそのままです。これにより、季節の対応を次のように整理できます。

\(x\) の範囲 季節
\(0 \leq x \leq 2\) Winter
\(3 \leq x \leq 5\) Spring
\(6 \leq x \leq 8\) Summer
\(9 \leq x \leq 11\) Autumn

例えば、\(M = 12\) なら \(x = 0\) となり、正しく Winter と判定できます。

アルゴリズム

  1. 月 \(M\) を読み込む。
  2. \(x = M \bmod 12\) を計算する。
  3. 次の順番で条件を判定し、対応する季節名を出力する。
    • \(x \leq 2\) なら Winter
    • そうでなく、\(x \leq 5\) なら Spring
    • そうでなく、\(x \leq 8\) なら Summer
    • それ以外なら Autumn

else if では、それ以前の条件が成り立たないことが分かっています。例えば、\(x \leq 5\) の判定まで進んだ時点で \(x > 2\) なので、この分岐はちょうど春の範囲に対応します。同様に、すべての季節を正しく判定できます。

計算量

  • 時間計算量: \(O(1)\)
  • 空間計算量: \(O(1)\)

余りの計算と定数回の比較だけを行い、使用する変数の数も一定です。

実装のポイント

  • C++ では、余りを求める演算子は % です。コードでは m % 12 と書きます。

  • 条件は小さい範囲から順に、if、else if、else でつなぎます。これにより、出力される季節は必ず \(1\) つになります。

  • 季節名は大文字・小文字も含めて、Spring、Summer、Autumn、Winter のとおりに出力してください。

    ソースコード

// 問題文から独立に実装: 12 月を 0 に読み替えて 3 か月ごとに区切る
#include <iostream>
int main() {
    int m; std::cin >> m;
    int x = m % 12;            // 12 -> 0, so winter is 0..2
    if (x <= 2) std::cout << "Winter" << std::endl;
    else if (x <= 5) std::cout << "Spring" << std::endl;
    else if (x <= 8) std::cout << "Summer" << std::endl;
    else std::cout << "Autumn" << std::endl;
}


この解説は gpt-6-astra-medium によって生成されました。