0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Ruby] AtCoder過去問 C - Go to School

Posted at

##はじめに
AtCoder過去問を解きました。
が、今回正解のコードは出来上がったものの理解し切れていません。。。

解説できる方がおられたら、コメント欄にて教えていただけると幸いです。

問題はこちらから確認ください。↓

##C - Go to School
この問題かなりややこしくて入力値のaで受け取っているところは、到着した順位を表しています。
先頭から出席番号1です。

出力で表示されている番号たちは順位ではなく、出席番号で、到着した順に並んでいます。

つまり入力値aの添字+1=出席番号です。

これらの情報をもとに、私がはじめに作ったコードはこちら↓
(このコードは不正解です)

n = gets.to_i
a = gets.split.map(&:to_i)

n.times do |x|
  puts a.index(x+1) + 1
end

上記のコード間違っているかどうかと言うより、処理時間が長すぎて不正解となりました。
この手の問題は繰り返し処理を行うと処理時間長すぎで不正解となることが最近わかってきました。

これが間違っていると言うことは配列の順番を並び替える処理だけで行うべきだと考えました。
しかし、冒頭で述べた通り入力と出力は同じ数字に見えても、データとしては別物なのでとても扱いにくいです。

いろんな人の回答を参考にして、最終的に下記のようなコードを作りました。
かなりシンプルです。

n = gets.to_i
a = gets.split.map(&:to_i)
 
puts a.sort_by{|i| a[i-1]}

紙に書き出して、自分で入力値を代入して、正解になるのはわかるのですが、どれだけ考えても理屈はわからずじまい。。。

説明できる方おられたらコメントで教えてもらえると幸いです。。。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?