##はじめに
AtCoderの過去問を解いている中で、タイトルのようなことを感じたので記事にします。
そのとき解いていたのはこちらの問題です。↓
C問題にしては割と難易度は低い気がしましたが、すごく良問だなと感じました。
##C - Exception Handling
この問題の解き方としては、まず入力値のAの部分を配列として受け取り、その中で一番大きい数字と二番目に大きい数字(一番目と重複していたら、それが二番目とする)を取り出します。
そして配列から一つずつ要素を取り出して一番大きい数字と比べ、同じだったら、二番目を出力(取り出した数字は比較対象から外れるため)。
それ以外だったら一番目を出力すればOKです。
最初に僕が提出して失敗したコードはこちらです。(厳密には実際とは違いますが、説明しやすくするため少し変更しています。失敗した原因は同じです)
n = gets.to_i
a = readlines.map(&:to_i)
a.each do |i|
if i == a.max(2).max
puts a.max(2).min
else
puts a.max(2).max
end
end
上記のコードでは時間がかかりすぎて不正解となりました。
a.max(2).max
が配列の中で一番大きい数字ですね。
a.max(2).min
が配列の中で二番目に大きい数字です。
なんとなく、負荷がいっぱいかかっているから不正解なわけで、軽くしたらいけるんじゃね?っと下記のコードに書き換えると通りました。
n = gets.to_i
a = readlines.map(&:to_i)
no1 = a.max(2).max
no2 = a.max(2).min
a.each do |i|
if i == no1
puts no2
else
puts no1
end
end
一番大きい数字を変数no1に代入、同じように二番目の数字をno2に代入した後に、先ほどのeach文を回しました。
最初のコードだとmaxメソッドとminメソッドをa回分使っているので処理が重かったのだと思います。
これだけで処理が通ったのでこういうの大切なのだなと思いました。