第60回【Python】傾斜配点

現在取り組んでいるのは、paiza ラーニング問題集「配列活用メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 60 回目です。

毎朝、昆布茶を飲むようにしてみました。昔は苦手だったのですが、なんだか美味しくいただけています。水溶性食物繊維の一種、フコイダンの響きが気に入っています。効果はまだ実感がない。

それでは、今日も頑張ってみようと思います。

傾斜配点

paiza の入社試験では 科目 1 〜 5 の 5 科目のテストが課せられており、それぞれの科目には重みが設定されています。受験者の得点は各科目の (とった点数) * (科目の重み) となります。 5 科目の得点の合計が最も高かった受験者の得点を求めてください。

N
M_1 M_2 M_3 M_4 M_5
A_{1,1} A_{1,2} A_{1,3} A_{1,4} A_{1,5}
...
A_{N,1} A_{N,2} A_{N,3} A_{N,4} A_{N,5}

・1 行目では、受験者の人数を表す整数 N が与えられます。
・2 行目では、1 〜 5 の各科目の重みを表す整数 M_1 〜 M_5 が半角スペース区切りで与えられます。
・続く N 行のうち i 行目では i 番目の受験者が各科目でとった点数を表す整数 A_{i,1} 〜 A_{i,5} が半角スペース区切りで与えられます。


すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ N ≦ 100 (1 ≦ i ≦ N)
・0 ≦ A_{i,j}, M_j ≦ 100 (1 ≦ i ≦ N, 1 ≦ j ≦ 5)


5
1 2 3 4 5
1 2 3 4 5
6 7 8 9 0
10 11 12 13 14
10 10 10 10 10
100 2 4 6 48

急に、ちょっと複雑になった。でも、似たようなことは実務でもよく行われている気がする。

Python
N = int(input())
M = [int(x) for x in input().split()]
total = 0
for _ in range(N):
    A = [int(x) for x in input().split()]
    temp = 0
    for i in range(5):
        temp += A[i] * M[i]
    if temp > total:
        total = temp
print(total)
VBA
N = Cells(1, 1)
M = Split(Cells(2, 1), " ")
Total = 0
For i = 0 To N - 1
    A = Split(Cells(i + 3, 1), " ")
    temp = 0
    For j = 0 To 4
        temp = temp + (Val(A(j)) * Val(M(j)))
    Next
    If temp > Total Then Total = temp
Next
Debug.Print Total

最後に

便利だからとやりがちなのが、「最も高かった」を max 関数で処理する方法。これは、if 大なり小なりを使用した方が早いらしい。LeoSaki(旦那)は、結構、max min を使いがちなので、これは覚えておこうと思った。

調べてみると、速度的には、現在の [int(x) for x in input().split()] よりも、list(map(int,input().split())) と書いた方が早い、らしい。なるほどなるほど。速度も意識して書こう。

引き続き、よろしくお願いいたします!

PythonPython,paiza,学習

Posted by LeoSaki