🔙
🔝

【paiza問題集 解説】
条件分岐メニュー

0 が含まれていないか判定

0 が含まれていないか判定

STEP: 1 単純な条件分岐

単純な条件分岐

STEP: 2 数値の分岐

数値の分岐

    N = int(input())
    if N <= 100:
        print('YES')
    else:
        print('NO')
    

    「以下」の比較式は <= です。

STEP: 3 数値演算結果で分岐

数値演算結果で分岐

    A, B, C = map(int,input().split())
    if A * B <= C:
        print('YES')
    else:
        print('NO')
    

    先に A * B が計算され、その結果が C と比較されます。

STEP: 4 ゼロ以外

ゼロ以外

    N = int(input())
    if N != 0:
        print('YES')
    else:
        print('NO')
    

    「以外」「○○ではない」は、!= と書きます。

FINAL問題 0 が含まれていないか判定

0 が含まれていないか判定

  • 例1

  • N = int(input())
    for _ in range(N):
        A = int(input())
        if A == 0:
            print('NO')
            break
    else:
        print('YES')
    
  • 例2

  • N = int(input())
    A = list(map(int, input().split()))
    
    if 0 in A:
        print('NO')
    else:
        print('YES')
    

    数列の先頭から 0 を探していき、0 を見つけたら NO、0 が見つからなかったら YES を画面に出力して終了します。

    特定の値を先頭から探すのを簡単に書けるようにしたものが in です。(例2)
    使用頻度極大なので早いうちにマスターしておきましょう。
    in については「2章 リスト型データを使いこなす機能一覧」で学習できます。

AND+OR

AND+OR

STEP: 1 AND

AND

    A, B = map(int, input().split())
    if A >= 10 and B >= 10:
        print('YES')
    else:
        print('NO')
    

    and は「○○ つ △△」という言い方がされ、and で繋いだ全ての条件式が True の時、最終的に True となります。

    A = 12
    B = 10 で、
    A >= 10 ( A が 10 以上) 且つ B >= 10 ( B が 10 以上) の時、(どちらも 10 以上の時)

    if True:
    

    となります。

STEP: 2 大文字判定

大文字判定

    C = input()
    if C.isupper():
        print('YES')
    else:
        print('NO')
    

    条件式に限らず、関数やメソッドの戻り値でも評価にかけられます。

    .isupper()メソッドは、文字列の文字が大文字かどうかを調べて、大文字の時は True を返します。反対に.islower()メソッドで小文字判定ができます。

STEP: 3 OR

OR

    A, B = map(int, input().split())
    if A >= 10 or B >= 10:
        print('YES')
    else:
        print('NO')
    

    or で繋いだ条件式のどれか1つでも True であれば、最終的に True になります。

STEP: 4 NOT

NOT

    X = int(input())
    if not (X >= 10):
        print('YES')
    else:
        print('NO')
    

    not は「TrueFalse に」、「FalseTrue に」変換します。not よりも比較式のほうが優先されますので ( ) は不要なのですが、わかりやすくするために付けています。

STEP: 5 AND+NOT

AND+NOT

    A, B = map(int, input().split())
    if A >= 10 and not (B >= 10):
        print('YES')
    else:
        print('NO')
    

    andnot を併せて使う場合はこう書きますという例のような問題です。順不同なので前後逆にしても正しく動作します。

FINAL問題 AND+OR

AND+OR

    X, Y, Z = map(int, input().split())
    if (X >= 10 and Y >= 10) or Z >= 10:
        print('YES')
    else:
        print('NO')
    

    『「Zが 10 以上の」場合はXとYの値にかかわらず』と問題文にありますので、Z は滑り止めみたいな感じでしょう。

    or の前後の式を逆にしても正しく動作します。

    ちなみに見やすくするために ( ) を付けていますけど、( ) を付ける範囲を間違えると異なる結果となる恐れがありますので十分注意してください。

FizzBuzz

FizzBuzz

STEP: 1 3 の倍数判定

3 の倍数判定

    N = int(input())
    if N % 3 == 0:
        print('YES')
    else:
        print('NO')
    

    3 の倍数というのは、3 で割り切れる数のことです。

STEP: 2 2 つの倍数判定

2 つの倍数判定

    N = int(input())
    if N % 3 == 0 and N % 5 == 0:
        print('YES')
    else:
        print('NO')
    

    3 で割り切れる数 N % 3 == 0 と 5 で割り切れる数 N % 5 == 0and で繋ぎます。

    また、N % 3 == 0 and N % 5 == 0N % 15 == 0 (15の倍数)と同等でもあります。

STEP: 3 偶奇の判定

偶奇の判定

  • 例1

  • _ = int(input())
    A = list(map(int, input().split()))
    
    even = 0
    odd = 0
    for i in A:
        if i % 2 == 0:
            even += 1
        else:
            odd += 1
    
    print(even, odd)
    
  • 例2

  • _ = int(input())
    A = list(map(int, input().split()))
    
    even_odd = [0, 0]
    for i in A:
        even_odd[i%2] += 1
    
    print(*even_odd)
    
  • 例3

  • _ = int(input())
    A = list(map(int, input().split()))
    even_odd = [i%2 for i in A]
    print(even_odd.count(0), even_odd.count(1))
    

    数列A の中に偶数と奇数がそれぞれいくつあるかをカウントして出力するプログラムです。

    例2と例3はもはや条件分岐していません。こんな書き方もできるよと、なんとなく書いただけです。辞書を使ってもいいですね。

STEP: 4 曜日の判定

曜日の判定

    N = int(input())
    
    if N % 7 == 1:
        print('Sun')
    elif N % 7 == 2:
        print('Mon')
    elif N % 7 == 3:
        print('Tue')
    elif N % 7 == 4:
        print('Wed')
    elif N % 7 == 5:
        print('Thu')
    elif N % 7 == 6:
        print('Fri')
    else:
        print('Sat')
    

    また、文を使わない書き方もあります。

    N = int(input())
    S = ['Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri']
    print(S[N%7])
    

    解読してみてください。😽

FINAL問題 FizzBuzz

FizzBuzz

  • 例1

  • N = int(input())
    
    if N % 3 == 0 and N % 5 == 0:
        print('FizzBuzz')
    elif N % 3 == 0:
        print('Fizz')
    elif N % 5 == 0:
        print('Buzz')
    else:
        print(N)
    
  • 例2

  • N = int(input())
    
    fizz = (N % 3 == 0)
    buzz = (N % 5 == 0)
    if fizz and buzz:
        print('FizzBuzz')
    elif fizz:
        print('Fizz')
    elif buzz:
        print('Buzz')
    else:
        print(N)
    

    比較式に ( ) を付けているのは、読みやすくしているだけです。無くても正しく動作します。

積の最小化

積の最小化

STEP: 1 けた数の測定

けた数の測定

  • 例1

  • N = input()
    print(len(N))
    
  • 例2

  • N = int(input())
    if N <= 9:
        print(1)
    elif N <= 99:
        print(2)
    else:
        print(3)
    

    ここは「条件分岐メニュー」ですので、今回は例2のやり方で書くほうがよいのですが、実際は例1のlen()関数を使ってください。

    len()関数は「2章 文字列の操作を使いこなす機能一覧」で学習できます。

STEP: 2 足したり引いたり

足したり引いたり

    N, A, B = map(int, input().split())
    
    if N+A+B and N-A+B and N+A-B and N-A-B:
        print('NO')
    else:
        print('YES')
    

    Python3 では 0 が False、0 以外が True となります。
    全ての組み合わせで計算して、全ての計算結果に 0 が無ければ True('NO')、0 が1つでもあれば False('YES')を画面に出力します。

    を使ったオーソドックスな書き方は paiza の解答コード例とその解説を参考にしてください。

STEP: 3 同値判定

同値判定

    N = int(input())
    A = list(map(int, input().split()))
    B = list(map(int, input().split()))
    
    cnt = 0
    for i in range(N):
        if A[i] == B[i]:
            cnt += 1
    
    print(cnt)
    

    要するに「A[i]B[i] の値が同じものがいくつあるか」ということです。

    A = [1, 2, 3, 4, 5]
    B = [1, 20, 30, 4, 5] の時

    A B 同じ? cnt
    1 1 1
    2 20 1
    3 30 1
    4 4 2
    5 5 3
STEP: 4 終了判定

終了判定

  • 例1

  • N = int(input())
    A = list(map(int, input().split()))
    
    sum_range = 0
    for i in range(N):
        if A[i] % 2 == 1:
            break
    
        sum_range += A[i]
    
    print(sum_range)
    
  • 例2

  • N = int(input())
    A = list(map(int, input().split()))
    
    for i in range(N):
        if A[i] % 2 == 1:
            print(sum(A[:i]))
            break
    
  • 例3

  • N = int(input())
    A = list(map(int, input().split()))
    
    i = 0
    while A[i] % 2 == 0:
        i += 1
    
    print(sum(A[:i]))
    

    まずは数列の先頭から「奇数を探し」て、数列の先頭からその奇数の1つ前までの数列の総和はいくつですか?ということです。終了判定は奇数の出現になります。

    奇数の判定に使う条件式は A[i] % 2 == 1 を使います。ループの終了は break を使います。

    例1は、偶数の値をその都度計算して、奇数が見つかったらループを抜けて総和の値を画面に出力しています。

    例2は、奇数が見つかったらスライスとsum()関数を使って総和を求めています。

    例3は、偶数の値はただひたすらループし、奇数を見つけたら例2と同じくスライスとsum()関数を使って総和を求めています。

STEP: 5 終了判定 2

終了判定 2

    n, K = map(int, input().split())
    
    cnt = 0
    while n < K:
        n *= 2
        cnt += 1
    
    print(cnt)
    

    K 以上になったら終了なので、K 未満の間はループし、その間カウントします。ループ回数が cnt の値そのものとなり、それが結果となります。

    見た目わかりにくいけど、これでも一応 の条件文の所で条件分岐してます。😅

STEP: 6 池の周回

池の周回

    N, K, T = map(int, input().split())
    
    if K*T % N == 0:
        print('YES')
    else:
        print('NO')
    

    ここでスキルチェックの様な問題が出てきました。
    T ターン歩いて最初の地点にいるかどうかは % N == 0 で判定できます。
    T ターンでちょうど最初の地点に到達するためには、1ターンが N ÷ T = K メートルでなければいけません。

    N ÷ T = K
       ↓
    K ✕ T = N

    N = 10
    K = 2
    の時、

    ターン T 1 2 3 4 5 6 7 8 9 10
    K*T % N 2 4 6 8 0 2 4 6 8 0

    K ✕ 5ターン毎ならば、最初の地点にぴったりになることがわかります。

STEP: 7 崖に落ちるか判定

崖に落ちるか判定

  • 例1

  • N, K, T = map(int, input().split())
    
    if N * K < T + 0.1:
        print('YES')
    else:
        print('NO')
    
  • 例2

  • N, K, T = map(int, input().split())
    
    if N * K <= T:
        print('YES')
    else:
        print('NO')
    

    若干曖昧さを含む問題ですが、入力値が整数しか扱わないという条件ですので、単純に「 T 以下なら YES 」ということで良いと思います。(例2)

    敢えて問題文に出てきた 0.1 という数を使うとしたら例1の様になると思います。

STEP: 8 タイルの敷き詰め

タイルの敷き詰め

    H, W = map(int, input().split())
    
    if H % 2 == 0 and W % 2 == 0:
        print('YES')
    else:
        print('NO')
    

    この問題が自力で解けるようになったら、割った余りが 0 の判定はどんな時に使うものなのかがだいたいわかってきた頃かと思います。

    高さ 2 のタイルが 高さ H にぴったり敷き詰められるかどうかは、H % 2 == 0 で判定できます。
    同様に幅 2 のタイルが 幅 W にぴったり敷き詰められるかどうかは、W % 2 == 0 で判定できます。

FINAL問題 積の最小化

積の最小化

    A, B = map(int, input().split())
    
    if A <= 0 <= B:
        print(A * B)
    else:
        print(min(abs(A), abs(B)) ** 2)
    

    まず、問題が何言ってるかネコにはわかりません。( ゚Д゚)y─┛~~
    ネコ用に翻訳しながら解き方をまとめてみます。

    • A 〜 B の中なら好きな数が使える。結局 A と B しか使わないけど。
    • A だけがマイナスの数(負数)の時は A * B すると最小値になる。
    • A と B のどちらもプラスの数(正数)なら A の数の方が小さいので A * A が最小値になる。
    • A と B のどちらもマイナスの数(負数)なら掛け算をするとプラスの数(正数)になるので 0 に近い B で掛け算 B * B をすると最小値になる。

    例を挙げて説明すると、
    ① A = -3 , B = 5 の時、-3 ✕ 5 = -15 が最小値。(A * B)
    ② A = 3 , B = 5 の時、3 ✕ 3 = 9 が最小値。(A * A)
    ③ A = -5 , B = -3 の時、-3 ✕ -3 = 9 が最小値。(B * B)

    ①は if A <= 0 <= B: の条件式。

    elseの方の min(abs(A), abs(B)) ** 2 では何をしているのかというと、A と B どちらも正数または負数なら、掛け算したら正数になるわけだから(②と③)、掛け算する前に先に絶対値(負数の場合、マイナスを外して正数にする)にして、数の小さい方を2乗すればいいんじゃないかなと、当時この問題を解いてた時に無い知恵絞って捻り出したもの。
    これがわかったら paiza の解答コード例のほうがわかりやすいかも・・・?(疑問形)

    絶対値をとるabs()は、プログラミングではそれなりに使います。頭の片隅にでも置いておいてください。いずれ使う時が来ますから。