問題: みかんを重さごとに仕分ける
入力:
仕分ける重さの区切りを表す整数 N
みかんの個数を表す整数 M
各みかんの重さ w_1 から w_M
例えば N = 10 の時、10 g, 20 g, 30 g ... のように仕分けられます。
そして、そのみかんの重さが一番近い数の重さに仕分けられます。
重さが一番近い箱が複数ある場合、数が大きい方の箱に仕分けられます。
- 24 g のみかんはより値の近い 20 g と書かれた箱に仕分けられます。
- 35 g のみかんは 30 g, 40 g の箱と差が同じです。この場合は数の大きい方の 40 g の箱へ仕分けてください。
- 0g に仕分けられることはないので、一番小さい重さに仕分けてください。
inputで複数の値を取得する際に、複数の値を取得する方法をまとめます。
指定された数の文字列を格納します。
# 入力された文字列を分割してNとMを取得します。
N, M = input().split()
stripメソッドとは
stripメソッドは、文字列型のメソッドで特定の文字列や空白文字を削除するためのメソッドです。
空白文字とは、スペースやタブ、改行のことを指します。
# strip()を使って入力された文字列から特定の文字列や空白文字を削除してNとMを取得します
N, M = input().strip().split()
次に、Python3のmap()を用いて、全ての要素に関数を適用します。int関数を使った記述方法は以下の通りです。
# map()を使って入力された文字列をintを使って、数値として分割してNとMを取得します
N, M = map(int, input().strip().split())
出力:
各みかんを最も近い重さに仕分け、その重さを出力
アプローチ:
標準入力から N, M と各みかんの重さを読み込む
各みかんの重さについて、仕分け先の重さを計算
仕分け先の重さを出力
def round_weight(N, weight):
# weight / N が 1 未満の場合、切り上げを行う。
if weight / N < 1:
return N
else:
# weight / N が 1 未満以外(weight / N が 1 以上)の場合、四捨五入を行う。
#ご指摘を受けて、修正しました。
#Python3のround関数は偶数丸めです。
#(round(5 / 2) = 2になります)
#(weight + N // 2) // Nなら正しく四捨五入できます。
return (weight + N // 2) // N
# 入力を受け取る
N, M = map(int, input().strip().split())
weights = [int(input().strip()) for _ in range(M)]
# 各みかんの重さを丸める
rounded_weights = [round_weight(N, weight) for weight in weights]
# 結果を出力する
for weight in rounded_weights:
print(weight)
コードの説明:
関数 round_weight の定義:
- weight: 仕分ける重さの区切り
- N: みかんの個数
みかんの重さに対する仕分け先の重さの計算:
- 各みかんの重さ weight に対して以下の処理を行います:
- もし weightをNで割って、1未満なら、そのまま N の箱に仕分けします。
- そうでない場合、weightをNを計算して、四捨五入します。
結果の出力:
- 各みかんの仕分け先の重さを順に出力します。
- このプログラムは、与えられた各みかんの重さを最も近い重さに仕分けし、その結果を正確に出力します。
他のレベルアップ問題
レベルD
レベルD相当の足し算についての解説は以下のリンクにあります。
足し算 (paizaランク D 相当) Python解答例