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 と判定できます。
アルゴリズム
- 月 \(M\) を読み込む。
- \(x = M \bmod 12\) を計算する。
- 次の順番で条件を判定し、対応する季節名を出力する。
- \(x \leq 2\) なら
Winter - そうでなく、\(x \leq 5\) なら
Spring - そうでなく、\(x \leq 8\) なら
Summer - それ以外なら
Autumn
- \(x \leq 2\) なら
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 によって生成されました。