🔙
🔝

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

競輪のユニフォーム

競輪のユニフォーム

  • 例1

  • n = int(input())
    
    if n == 1:
        print('white')
    elif n == 2:
        print('black')
    elif n == 3:
        print('red')
    elif n == 4:
        print('blue')
    elif n == 5:
        print('yellow')
    elif n == 6:
        print('green')
    elif n == 7:
        print('orange')
    elif n == 8:
        print('pink')
    else:
        print('purple')
    
  • 例2

  • colors = ['white', 'black', 'red', 'blue', 'yellow', 'green', 'orange', 'pink', 'purple']
    
    n = int(input())
    print(colors[n-1])
    

    Dランクレベルなら例1の書き方でよいのですが、Cランクレベルなら例2のリストを使った形で書きましょう。

    要素番号は 0 から始まりますので、取得した入力値から 1 を引く必要があります。辞書を使ってもよいですが、その場合のキーはそのまま 1 から順に割り当てていけば、出力の際に 1 を引く必要がなくなります。

エレベーターの行き先

エレベーターの行き先

    f1, f2 = input().split()
    
    if int(f2[0]) > int(f1[0]):
        print('up')
    else:
        print('down')
    

    まず入力値は文字列で受け取っておきます。

    文の条件式中で文字列となっている階数を整数に変えて利用します。

    f1 = '1F'
    f2 = '5F' の時、

    f1[0] = '1'
    f2[0] = '5'

    int(f1[0]) = 1
    int(f2[0]) = 5

    プログラム例では f1 と f2 を比較する際に、f2 のほうを先に書いています。これは比較する際に、ターゲットとなる値を左に書くルールがある為です。これは英語の文法に沿った書き方であるとも言えます。

    if 5 greater than 1:
    (もし、5 が 1 よりも大きいならば)


    n > 0 の時、Python3では、

    if 0 < n:
    

    と左右反対の書き方をしてもエラーは起こりませんが、言語によってはこの書き方ではエラーになります。変数ならばOKなのですが、値を左側に直接書いて比較することができないのです。一部古い言語ではこうなっていたので半ば慣習のようなものにもなっています。

    と言いつつ、私はテキトーに書いてますけどね!😎


    『あ、逆だった。直すのメンドイからもういいや。』

長方形の面積

長方形の面積

    e1, e2 = map(int, input().split())
    print(e1 * e2)
    

    スキルチェックに挑戦するのであれば、わざわざ文字列で入力値を受け取ってから int() 関数で整数に変換するよりも、この入力方法を使えば簡単です。入力例の形式がほぼ決まっていますので、標準入力の受け取り方は憶えてしまいましょう。

    標準入力は「3章 標準入力」をご覧ください。

セール販売

セール販売

  • 例1

  • n = int(input())
    target_item = 'pants'
    
    purchased_items = set()
    sub_total = 0
    for _ in range(n):
        c, p = input().split()
        purchased_items.add(c)
        sub_total += int(p)
    
    if (target_item in purchased_items) and sub_total >= 2000:
        total = sub_total - 500
    else:
        total = sub_total
    
    print(total)
    

    少し丁寧に書いてみました。🤓

    この中で最も重要な値は「小計」です。購入アイテムのそれぞれの金額を sub_total に集計します。それが 文の中身です。

    このついでにズボンが含まれているかを後にチェックするために、セット型で用意した purchased_items に購入品目を記録していきます。

    文でまずズボンが含まれているか target_item in purchased_items、そして購入金額(小計)が 2000円以上かどうか sub_total >= 2000 を調べます。

    問題文に合わせて小計と合計とで分けて書いたのでちょっと回りくどく見えるかもしれませんが、流れとしてはこんな感じでしょう。

  • 例2

  • n = int(input())
    target_item = 'pants'
    
    receipt = {}
    for _ in range(n):
        c, p = input().split()
        receipt[c] = receipt.get(c, 0) + int(p)
    
    total = sum(receipt.values())
    
    if (target_item in receipt.keys()) and total >= 2000:
        total -= 500
    
    print(total)
    

    例2のこちらは辞書を使って書いています。辞書には購入品目とその合計値が記録されます。例えば問題集の入力例2の場合、

    2
        4
        shirt 500
        pants 1000
        pants 500
        shoes 2000
    

    1000円と500円の pants 2つで1500円なのでこれを合わせて、

    reciept = {'shirt': 500, 'pants': 1500, 'shoes': 2000}

    という辞書データで出来上がります。これをやっているのが 文の中身です。


    次にこの辞書データから購入額の小計を求めます。 sum()関数の引数にある .values()メソッドは、辞書データの値の部分だけを取り出してリスト化する機能です。

    total = sum(receipt.values())
    

    total = sum([500, 1500, 2000])
    

    total = 4000
    

    文の中にも .key()メソッドが使われてますが、こちらはキーの部分だけを取り出してリスト化する機能です。 .key() は省略することができますが、どの部分を参照しているかを明示するためにも書いておくことをオススメします。


    辞書型の各メソッドについては「2章 辞書を使いこなす機能一覧」をご覧ください。