🔙
🔝

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

スポーツの人数

スポーツの人数

  • 例1

  • s = input()
    
    if s == 'baseball':
        print(9)
    elif s == 'soccer':
        print(11)
    elif s == 'rugby':
        print(15)
    elif s == 'basketball':
        print(5)
    else:
        print(6)
    
  • 例2

  • nums = {
        'baseball': 9,
        'soccer': 11,
        'rugby': 15,
        'basketball': 5,
        'volleyball': 6
    }
    
    s = input()
    print(nums[s])
    

    例1は 文で1つ1つ判定していく方法、例2は辞書を使った方法です。見比べてみるとわかってくると思いますが、辞書は文の代わりとしても使えます。

    {key: value}

    とした場合、「 s が key の時に value となる」わけです。

    条件外の話になりますが、例1の場合はその他の文字列でも 6 と出力されてしまいます。例2の場合は辞書に s と同じキーが無ければエラーとなります。

バイトの休憩時間

バイトの休憩時間

  • 例1

  • h = int(input())
    
    if h <= 6:
        print('no break')
    elif h > 8:
        print('60 min')
    else:
        print('45 min')
    
  • 例2

  • h = int(input())
    within_range = 45
    over_range = 60
    
    if h <= 6:
        print('no break')
    elif h > 8:
        print(over_range, 'min')
    else:
        print(within_range, 'min')
    

    『勤務時間が6時間を超え』なので、6時間「以下 <=」は 'no break' です。
    『6時間を超え、8時間以下』の時の条件文を書くのが面倒なので elseに投げました。😅 もし書くとするならば、

    if h > 6 and h <= 8:
    

    もしくは

    if 6 < h <= 8:
    

    となります。さらに 68 も変数にしておくともっと良いでしょう。

自動車の燃費

自動車の燃費

  • 例1

  • v, d = map(int, input().split())
    print(int(d / v))
    
  • 例2

  • v, d = map(int, input().split())
    print(d // v)
    

    この問題で求められる『燃費』とは、俗に言う「リッター何キロ」です。走行距離(km)を消費した燃料(L)で割ると、1リットルあたりの走行距離が求められます。

    期待する出力に『ただし、燃費は小数点以下を切り捨てて出力してください。』とありますので、単に / ではなく、割り算を求めてから小数点以下を切り捨てる int(d / v) で結果を出力しますが、// でも同じ出力結果になります。

    int(d / v)
    ( ) 内の計算結果から小数点以下を切り捨てて整数のみにする。
    d // v
    割り算の を求める。

    期待する出力の文言どおりなら前者です。結果は同じと思っても、時々与えられた条件や文言に従わないと不具合が起こることがありますので注意してください。例えば次のような場合、

    【常に整数で計算する場合】

    5 // 3 + 5 // 3

    1 + 1 = 2

    【最後に小数を切り捨てる場合】

    int(5 / 3 + 5 / 3)

    int(1.66666… + 1.66666…)

    int(3.33333…) = 3

    となり、切り捨て では違う結果になることがあります。ジーマーで気を付けて!!

背番号順

背番号順

    n = int(input())
    members = [[int(b), p] for _ in range(n) for b, p in [input().split()]]
    
    for num, name in sorted(members):
        print(num, name)
    

    Python式のこの入力方法ならば、一文で欲しい入力結果が得られます。
    あとはまるごとソートするだけです。二次元リストになっています。Cランクの解き方じゃないのかな、これ?😆

    1
        3
        83 PAIZA
        11 SUZUKI
        90 TANAKA
    

    問題集のこの入力例を使って上記の入力方法で値を取得すると次のようになります。

    members = [[83, 'PAIZA'], [11, 'SUZUKI'], [90, 'TANAKA']]

    これを sorted() 関数にかけてソートすると、まず背番号から昇順ソートされます。

    members = [[11, 'SUZUKI'], [83, 'PAIZA'], [90, 'TANAKA']]

    背番号が複数存在する場合は、次に名前を使って昇順ソートされるのですが、問題文に『ただし、同じ背番号の選手は存在しないものとします。』とありますので、この並びの状態がソート結果となります。