teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

例題について追加

2017/03/04 22:26

投稿

raccy
raccy

スコア21768

answer CHANGED
@@ -18,4 +18,44 @@
18
18
 
19
19
  これで、Mijが`m[j][i]`としてアクセス可能です。このあと、ゆっくり処理を考えます。
20
20
 
21
- 競プロでは入力に対して、処理の方が大変大きいです。その場合、入力をまとめて始めにやった方がわかりやすいですし、速度が不利になると言うことはありません。大量のログ解析やWebアクセスなどデータが大量にあり、入力に待ちが発生しやすい場合は、マルチスレッドにして各行を並列に読み込んで処理して、いらなくなったデータをどんどん捨てていく方が有利になりますが、入力が小さいときは無視できるような違いしかありません(かといって、別の所では必要になるテクニックではありますが)。
21
+ 競プロでは入力に対して、処理の方が大変大きいです。その場合、入力をまとめて始めにやった方がわかりやすいですし、速度が不利になると言うことはありません。大量のログ解析やWebアクセスなどデータが大量にあり、入力に待ちが発生しやすい場合は、マルチスレッドにして各行を並列に読み込んで処理して、いらなくなったデータをどんどん捨てていく方が有利になりますが、入力が小さいときは無視できるような違いしかありません(かといって、別の所では必要になるテクニックではありますが)。
22
+
23
+ ---
24
+
25
+ 例題の場合はこうなります。
26
+ ※ 2.4.0で追加された`Array#sum`を使っているので、2.4.0以降でないと動きません。
27
+
28
+ ```Ruby
29
+ # frozen_string_literal: true
30
+ # 入力処理
31
+ n = gets.to_i
32
+ students = Array.new(n) { gets.split }
33
+ .map { |field, *scores| [-field, scores.map(&:to_i)] }
34
+ # 結果作成
35
+ results = students.map do |field, scores|
36
+ next false if scores.sum < 350
37
+ case field
38
+ when 'so'
39
+ scores[0] + scores[4] >= 150
40
+ when 'sc'
41
+ scores[1] + scores[3] >= 150
42
+ end
43
+ end
44
+ # 出力処理
45
+ students.zip(results).each do |student, result|
46
+ if result
47
+ case student.first
48
+ when 'so'
49
+ puts '文系クラス合格'
50
+ when 'sc'
51
+ puts '理系クラス合格'
52
+ end
53
+ else
54
+ puts '残念でした'
55
+ end
56
+ end
57
+ ```
58
+
59
+ 入力の時点で文系か理系かのところと各スコアを分離します。各スコアは数値に変換しておきます。文系か理系かはシンボルにしても良いかもしれません(でも、freezeしているから速度は違わないかな)。結果を求める処理では合格判定だけを結果として得ます。何を出力するかはその後です。最後に結果に基づき出力します。
60
+
61
+ 競プロからは離れてしまいますが、本格的にやるにはクラスを作った方がRubyらしくなります。競プロはアルゴリズムしか重要視されませんが、本当に可読性を高めようと思うなら、細かくクラスやメソッドにわけることが重要になります。もうひとつ重要な考えとしてオブジェクトをmutableとimmutableのどちらで扱うかです。上記コードはimmutableで書いていますが、オブジェクトの生成にはコストがのしかかってくるため、処理時間がシビアな問題ではきつくなる場合があります。