このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の配列活用メニューから「傾斜配点 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
paiza の入社試験では 科目 1 〜 5 の 5 科目のテストが課せられており、それぞれの科目には重みが設定されています。受験者の得点は各科目の (とった点数) * (科目の重み) となります。 5 科目の得点の合計が最も高かった受験者の得点を求めてください。
入力される値
1 2 3 4 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 |
S |
- 5 科目の得点の合計が最も高かった受験者の得点 S を 1 行で出力してください。
- また、出力の末尾には改行を入れてください。
考え方
執筆中
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 1行目は読み飛ばす _ = readLine()! // 重みを読み込む let ma = readLine()!.split(separator: " ").map { Int($0)! } // 1. 成績一覧を読み込み // 2. 各行を空白をあけて Int に変換し、 // 3. その各行に重みをづけて加算し // 4. その配列のうち一番大きい値だけを返す // 型推論を確実に行わせるために、受け取る変数の型を明示する let m: Int = Array(AnyIterator { readLine() }) .map { $0.split(separator: " ").map { Int($0)! } } .map { s in var sum = 0 for (index, val) in s.enumerated() { sum += val * ma[index] } return sum }.max()! // 最大値を表示する print(m) |