4月26日に開催されたAtCoder Beginner Contest 164にRubyで参加しました。
今日はC問題の復習です。
各問題の制約や入力・出力例は引用元ページ(AtCoderのサイト)をご覧ください。
C - gacha
問題文
くじ引きを N 回行い、i 回目には種類が文字列 Si で表される景品を手に入れました。
何種類の景品を手に入れましたか?入力
入力は以下の形式で標準入力から与えられる。
N
S1
:
SN出力例 1
2
(apple と orange の 2 種類の景品を手に入れました。)
提出したコード
n = gets.to_i array = [] n.times { array << gets.chomp } puts array.uniq.size
結果:AC(正解) 実行時間:167 ms
考えたことを言語化してみる
1行目:gets
で取得した値(文字列)をto_i
で整数へ変換し、変数nに代入(to_i
があるのでchomp
は不要)。
2行目:空の配列arrayを作る。array = Array.new
でも同じ。
3行目:次の行をgets
で取得しchomp
で末尾の改行を削除したものを、配列arrayに要素として追加していく。それをn回繰り返す。
4行目:uniq
で配列arrayから重複した要素を削除し、size
で配列の要素数を取得。puts
でそれを出力。
改善点など
自分なりにはこれでいいかなと思ったんですが、他の参加者の皆様のコードを見ると、Rubyとは思えないような何が書いてあるのかもわからないコードなどいろいろな書き方があって本当に勉強になります。
自分は一流の競技プログラマを目指しているわけではないので、読みやすくわかりやすいコードを心がけています。でも1行ですごく短いのにAC(正解)しかも実行速度が速いコードとか見たときに意味はわかるようになりたいです。
今回はreadlines
というモジュールを発見したので紹介します。
readlines
は、gets
(入力値の読み込み)を複数行できるモジュールです。標準入力の各行を配列に入れていって最後の行までいくと自動で止まります。
たとえば、以下の入力値を取得してみます。
3 apple orange apple
readlines
で取得する
p readlines #=> ["3\n", "apple\n", "orange\n", "apple\n"] p readlines.map(&:chomp) #=> ["3", "apple", "orange", "apple"]
readlines
を使ってC問題をやってみる
puts readlines.uniq.size - 1 #=> 2
結果:AC(正解) 実行時間:111 ms
- 1
するのは、1行目のn
を除くためです。readlines
便利!これから使っていきたいと思います。
感想
初めてC問題までできたので嬉しかったです。今回も新たな発見があって勉強になりました。
AtCoderのレートは15回ぐらいコンテストに参加しないと本来のレベルにならないそうです。目標の茶色コーダーになるためにはC問題までできればいいらしいので、この調子で頑張りたいです。
AtCoder で茶色コーダー、つまりレーティング 400 に到達するためには、
・AtCoder Beginner Contest の A, B 問題が確実に(大方 15 分以内で)解ける
・AtCoder Beginner Contest の C 問題も簡単なものなら解ける