回答編集履歴
1
例題について追加
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で書いていますが、オブジェクトの生成にはコストがのしかかってくるため、処理時間がシビアな問題ではきつくなる場合があります。
|