🔙
🔝

【paiza問題集 解説】
paizaの森練習問題コンテスト過去問題セット15

出力の練習

出力の練習

    the_unique_truth_in_the_world = '池田千歳は俺の嫁'
    print(the_unique_truth_in_the_world)
    

    !🐱

red があるか調べてみよう

red があるか調べてみよう

    lst = input().split()
    target = 'red'
    
    if target in lst:
        print('Yes')
    else:
        print('No')
    
階乗

階乗

    n = int(input())
    
    result = 1
    for i in range(2, n+1):
        result *= i
    
    print(result)
    
単語のカウント

単語のカウント

  • 例1

  • lst = input().split()
    
    words = []
    counts = []
    for word in lst:
        if word in words:
            counts[words.index(word)] += 1
        else:
            words.append(word)
            counts.append(1)
    
    for results in zip(words, counts):
        print(*results)
    
  • 例2

  • lst = input().split()
    
    words = {}
    for word in lst:
        if word in words:
            words[word] += 1
        else:
            words[word] = 1
    
    for key, value in words.items():
        print(key, value)
    
  • 例3

  • lst = input().split()
    
    words = {}
    for word in lst:
        words[word] = words.get(word, 0) + 1
    
    for key, value in words.items():
        print(key, value)
    
  • 例4

  • from collections import Counter
    
    words = Counter(input().split())
    
    for key, value in words.items():
        print(key, value)
    

    例1は一次元リストだけで辞書っぽく扱ったものです。

    例2と例3は辞書を使った一般的な方法です。

    例4は collections モジュールの Counterクラスを使った便利ワザです。 Counter() の () 内にリストを入れるだけで、出現したワードごとにカウントしたものを辞書型にして作ってくれます。別に要らないんじゃないかなと思うかもしれませんが、何をしているのかが一発でわかるというメリットは根強く残されています。😅

倍数の存在

倍数の存在

  • 例1

  • a, b, c = map(int, input().split())
    
    for i in range(b, c+1):
        if i % a == 0:
            print('Yes')
            break
    else:
        print('No')
    
  • 例2

  • a, b, c = map(int, input().split())
    print('Yes' if c%a <= c-b else 'No')
    

    例1はブルートフォースアタック。手当たり次第に b → c を a で割っていく方法です。

    例2は当時私が提出したもの。久々に見たらナニコレと思い、我らが ChatGPT に訊いてみました。

    プログラムの正当性証明 (ChatGPT)

    どうやら私は、勉強するとバカになるタイプようです。😅
    前問の提出から間13分足らずで提出してるし。冴えてるな。


  • 例3

  • a, b, c = map(int, input().split())
    print('Yes' if b <= c-(c%a) <= c else 'No')
    

    例3の様に書くこともできます。
    c-(c%a) というのは、c 以下の数で最も大きな a の倍数です。それが b から c の間に存在するかどうかを調べています。c 以下の数で最も大きな a の倍数なので、単に b 以上 c-(c%a) >= b としてもいいハズ。

    例2より、こっちのほうがわかりやすいじゃなイカ。

全員が不正答

全員が不正答

  • 例1

  • n, m = map(int, input().split())
    c = [list(map(int, input().split())) for _ in range(m)]
    
    answers = [m] * n
    for i in range(m):
        for j in range(n):
            answers[j] -= c[i][j]
    
    print('Yes' if 0 in answers else 'No')
    
  • 例2

  • _, m = map(int, input().split())
    c = [list(map(int, input().split())) for _ in range(m)]
    
    for answers in zip(*c):
        if not any(answers):
            print('Yes')
            break
    else:
        print('No')
    
  • 例3

  • _, m = map(int, input().split())
    c = [list(map(int, input().split())) for _ in range(m)]
    
    print('Yes' if any(not any(answers) for answers in zip(*c)) else 'No')
    
  • 例4

  • n, m = map(int, input().split())
    c = set(int(input().replace(' ', ''), 2) for _ in range(m))
    
    ans = 0
    for i in c:
        ans |= i
    
    print('Yes' if ans != pow(2, n) - 1 else 'No')
    

    全員が正答」の 1 が 0 になったものです。真逆なので、例1は引き算に、例2例3は all()any に変えて評価結果を not で反転しています。

    all()
    all([1, 1, 1]) → True
    not any()
    not any([1, 0, 0]) → not True → False
    not any([0, 0, 0]) → not False → True

    例4は論理和で演算しています。論理和は「0 と 0 の時だけ 0 になる」。それ以外は 1 になるので、最終的にどこかのビットに1つでも 0 があれば Yes となります。


    詳しい解説は「全員が正答」を参考にしてください。