Python AtCoder入門 第3講 条件分岐 第2講までで、入力を受け取って計算し、出力できるようになりました。 この講では、入力に応じて処理を変える 条件分岐 を扱います。 1
今回のテーマ 「もし〜だったら、こうする」 この判断ができるようになると、解ける問題の幅が一気に広がります。 AtCoderのA問題の多くは、 入力 → 条件分岐 → 出力 という形です。 2
この講のゴール この講のゴールは、 条件の書き方と、場合分けの整理の仕方に慣れること です。 文法自体はシンプルですが、順番を間違えると答えが変わります。 3
コードファイル名の方針 この講でも、コード例ごとにファイル名を付けます。 例: compare.py grade.py range_check.py yes_no.py leap_year.py 手元では同じ名前で保存して実行してください。 4
3-1 if / elif / else 条件分岐では、 if elif else を使います。 まずは基本の形を覚えましょう。 5
if の基本形 if 条件: 条件が True のときの処理 条件が成り立つときだけ、下のブロックが実行されます。 条件が成り立たなければ、何も実行されません。 6
2つに分けるなら else if 条件: 条件が True のときの処理 else: 条件が False のときの処理 は、 それ以外 を表します。 else 7
3つ以上に分けるなら elif if 条件A: Aのときの処理 elif 条件B: Aではなく、Bのときの処理 else: どれにも当てはまらないときの処理 は else if の略です。 いくつでも並べられます。 elif 8
インデントがブロックを作る Pythonでは、 行頭の空白 でブロックを表します。 if x > 0: print("Positive") print("Done") print("End") インデントされている2行だけが if の中身です。 9
indent.py x = 5 if x > 0: print("Positive") print("Done") print("End") 出力: Positive Done End 10
if の外にある処理 次の行は、インデントされていません。 print("End") そのため、 if の条件に関係なく常に実行されます。 Pythonではインデントがとても重要です。 11
インデントは半角スペース4個 Pythonでは、 半角スペース4個 でインデントするのが標準です。 深さがずれると、 IndentationError になり、プログラムが動きません。 12
エラーが出たらインデントを疑う 初心者がよく出すエラーの1つが、 IndentationError です。 特に、 行頭の空白が足りない 空白の数がそろっていない タブとスペースが混ざっている 場合に起こります。 13
比較演算子 条件を書くときは、比較演算子を使います。 演算子 == != < > <= >= 意味 等しい 等しくない より小さい より大きい 以下 以上 14
= と == の違い = は代入です。 x = 5 == は比較です。 if x == 5: print("Yes") 等しいかどうかを調べるときは、 == を使います。 15
bool.py print(3 < 5) print(3 == 5) 出力: True False 比較の結果は、 True False という値になります。 16
compare.py # Read two integers separated by a space A, B = map(int, input().split()) # Compare and print the result if A > B: print("A is larger") elif A < B: print("B is larger") else: print("Equal") 17
compare.py の実行例 入力例: 7 3 出力例: A is larger A > B でも A < B でもない場合は、 A == B です。 18
else は「残り全部」 「残りの場合」が1通りしかないとわかっているなら、 else: で受けられます。 条件をもう一度書かなくてよいので、コードがすっきりします。 19
grade.py # Read a score N = int(input()) # Assign a grade if N >= 80: print("A") elif N >= 60: print("B") elif N >= 40: print("C") else: print("D") 20
grade.py の実行例 入力例: 72 出力例: B 72 は N >= 60 を満たすので、そこで分岐が決まります。 21
elif は上から順に判定される は上から順に判定されます。 そして、 最初に当てはまったところで終わります。 N = 72 は N >= 40 も満たしますが、そこまでは見ません。 elif 22
条件の順番が重要 もし順番を間違えて、 if N >= 40: print("C") elif N >= 60: print("B") と書くと、90点でも C になってしまいます。 23
鉄則 を並べるときは、 厳しい条件から先に書く ことが大切です。 点数の例なら、 80点以上 60点以上 40点以上 の順です。 elif 24
3-2 論理演算子 複数の条件を組み合わせるときは、 and or not を使います。 Pythonでは && や || ではなく、英単語で書きます。 25
and / or / not 演算子 A and B A or B not A 意味 成り立つとき かつ AとBの両方が True または AとBの少なくとも一方が True ではない Aが False 26
and の例 if x >= 0 and x <= 100: print("In range") これは、 0以上 かつ 100以下 という意味です。 両方を満たす必要があります。 27
or の例 if x == 0 or y == 0: print("At least one is zero") これは、 xが0 または yが0 という意味です。 どちらか一方でも成り立てばOKです。 28
連鎖比較 Pythonでは、範囲判定を数学のように書けます。 if 0 <= x <= 100: print("In range") これは次と同じ意味です。 if 0 <= x and x <= 100: print("In range") 29
範囲判定は連鎖比較で書く 範囲判定では、 0 <= x <= 100 のような書き方を優先しましょう。 数式に近いので読みやすく、書き間違いも減ります。 30
range_check.py # Read an integer X = int(input()) # Check whether X is within the range if 0 <= X <= 100: print("In range") else: print("Out of range") 31
range_check.py の実行例 入力例: 42 出力例: In range 42 は0以上100以下なので、範囲内です。 32
複数条件を混ぜるとき と or を混ぜるときは、 丸括弧で意図をはっきりさせる のがおすすめです。 動くコードでも、読みにくいとバグの原因になります。 and 33
括弧なしと括弧あり 括弧なし: if a == 0 or b == 0 and c == 0: ... 括弧あり: if a == 0 or (b == 0 and c == 0): ... 括弧があるほうが意図が明確です。 34
multi_conditions.py # Read three integers separated by a space A, B, C = map(int, input().split()) # Check whether all three are even if A % 2 == 0 and B % 2 == 0 and C % 2 == 0: print("All even") # Check whether at least one is even elif A % 2 == 0 or B % 2 == 0 or C % 2 == 0: print("Some even") else: print("All odd") 35
multi_conditions.py の実行例 入力例: 2 3 4 出力例: Some even 全部偶数ではありませんが、偶数が含まれています。 36
厳しい条件から先に書く この例でも、 全部偶数 を先に判定しています。 「全部偶数」は「少なくとも1つ偶数」より厳しい条件です。 先に書かないと正しく分類できません。 37
3-3 条件分岐の頻出パターン AtCoderでは、条件分岐にいくつかの定番があります。 特によく出るのは、 Yes / No 問題 です。 38
Yes / No 問題の定石 if 条件: print("Yes") else: print("No") 条件を満たすなら Yes 。 満たさないなら No 。 A問題で非常によく出ます。 39
大文字小文字に注意 必ず問題文の指定に合わせます。 Yes / No YES / NO yes / no これらはすべて別物です。 迷ったら、問題文からコピーしましょう。 40
yes_no.py # Read two integers separated by a space A, B = map(int, input().split()) # Print Yes if the sum is even, otherwise No if (A + B) % 2 == 0: print("Yes") else: print("No") 41
yes_no.py の実行例 入力例: 3 5 出力例: Yes 3 + 5 = 8 で偶数なので、 Yes です。 42
場合分けの整理術 条件が増えると、頭の中だけでは整理しにくくなります。 そんなときは、コードを書く前に紙で整理します。 やることは2つです。 1. 漏れなく、重ならないように分ける 2. 厳しい条件から順に並べる 43
漏れなく・重ならない たとえば数直線なら、 x < 0 0 <= x < 10 10 <= x のように分けます。 すべての場合を覆い、どの2つも重ならない形にします。 44
厳しい条件から順に は上から順に判定されます。 そのため、 特別なケースほど上に書く のが基本です。 順番そのものが、答えを決めます。 elif 45
例:うるう年判定 うるう年には、次のルールがあります。 4で割り切れる年は、うるう年 ただし、100で割り切れる年は、うるう年ではない ただし、400で割り切れる年は、うるう年 46
「ただし」を順番で表現する 厳しい条件から順に並べます。 1. 400で割り切れる 2. 100で割り切れる 3. 4で割り切れる 4. それ以外 この順なら、入れ子にしなくても書けます。 47
leap_year.py # Read a year Y = int(input()) # Check the conditions from the most specific to the most general if Y % 400 == 0: print("Yes") elif Y % 100 == 0: print("No") elif Y % 4 == 0: print("Yes") else: print("No") 48
leap_year.py の実行例 入力例: 2000 出力例: Yes 2000 は400で割り切れるので、うるう年です。 49
うるう年の例 :400で割り切れる → Yes 1900 :100で割り切れる → No 2024 :4で割り切れる → Yes 上に書いた条件で拾われたものは、下には流れません。 2000 50
章末まとめ / elif / else で分岐します。 ブロックの範囲は、 インデント で表します。 インデントは半角スペース4個が標準です。 if 51
章末まとめ:比較 比較には == を使います。 if x == 5: print("Yes") は代入です。 比較の結果は True / False になります。 = 52
章末まとめ:elif は上から順に判定されます。 そして、最初に当てはまったところで終わります。 だから、 厳しい条件から先に書く ことが重要です。 elif 53
章末まとめ:論理演算子 条件の組み合わせには、 and or not を使います。 and と or を混ぜるときは、丸括弧で意図を明確にしましょう。 54
章末まとめ:範囲判定 範囲判定は、数式のように書けます。 if 0 <= x <= 100: print("In range") AtCoderでもよく使います。 55
章末まとめ:Yes / No Yes / No 問題は定番です。 if 条件: print("Yes") else: print("No") ただし、大文字小文字は問題文と完全に一致させます。 56
練習問題 3-1 符号の判定 整数 N が与えられます。 N が正なら Positive 、 0 なら Zero 、負なら Negative と出力してください。 57
練習問題 3-1:入力と出力 入力: N 入力例: -7 出力例: Negative 3つの場合に分けます。 58
answer_3_1.py # Read an integer N = int(input()) # Determine the sign if N > 0: print("Positive") elif N == 0: print("Zero") else: print("Negative") 正でも0でもなければ、必ず負です。 59
練習問題 3-2 三角形になるか 3辺の長さ A , B , C が与えられます。 この3辺で三角形を作れるなら Yes 、作れないなら No を出力してください。 60
三角形が作れる条件 三角形が作れるのは、 どの1辺も、残り2辺の和より短い ときです。 つまり、次の3つすべてを満たす必要があります。 A + B > C B + C > A C + A > B 61
練習問題 3-2:入力と出力 入力: A B C 入力例: 3 4 5 出力例: Yes 3つの条件を and でつなぎます。 62
answer_3_2.py # Read three side lengths A, B, C = map(int, input().split()) # All three inequalities must hold if A + B > C and B + C > A and C + A > B: print("Yes") else: print("No") >= ではなく > です。 63
練習問題 3-3 映画館の料金 映画館の料金は、次のルールで決まります。 水曜日なら、年齢にかかわらず1000円 水曜日以外で15歳以下なら800円 水曜日以外で60歳以上なら1200円 それ以外なら1800円 64
練習問題 3-3:入力と出力 入力: A W は年齢です。 W は水曜日なら 1 、それ以外なら 0 です。 入力例: A 70 1 出力例: 1000 65
条件の優先順位 この問題では、 水曜日かどうか が最も強い条件です。 70歳でも、水曜日なら1000円です。 年齢の判定を先に書くと、答えが変わってしまいます。 66
answer_3_3.py # Read the age and the weekday flag A, W = map(int, input().split()) # Wednesday has the highest priority if W == 1: print(1000) elif A <= 15: print(800) elif A >= 60: print(1200) else: print(1800) 条件の順番がそのまま答えを決めます。 67
次回予告 次の第4講では、 ループ を扱います。 同じ処理を何度も繰り返せるようになると、B問題の世界に入っていきます。 68