0
0

More than 1 year has passed since last update.

[Ruby] できるだけ負荷をかけない処理を意識するのは大事だなと思いました

Last updated at Posted at 2021-09-26

はじめに

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回分使っているので処理が重かったのだと思います。

これだけで処理が通ったのでこういうの大切なのだなと思いました。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0