C - gacha(AtCoder Beginner Contest 164 復習)

4月26日に開催されたAtCoder Beginner Contest 164Rubyで参加しました。

今日はC問題の復習です。

各問題の制約や入力・出力例は引用元ページ(AtCoderのサイト)をご覧ください。

C - gacha

問題文
くじ引きを N 回行い、i 回目には種類が文字列 Si で表される景品を手に入れました。
何種類の景品を手に入れましたか?

入力
入力は以下の形式で標準入力から与えられる。
N
S1
:
SN

入力例 1
3
apple
orange
apple

出力例 1
2
apple と orange の 2 種類の景品を手に入れました。)

C - gacha

提出したコード

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便利!これから使っていきたいと思います。

docs.ruby-lang.org

感想

初めてC問題までできたので嬉しかったです。今回も新たな発見があって勉強になりました。

AtCoderのレートは15回ぐらいコンテストに参加しないと本来のレベルにならないそうです。目標の茶色コーダーになるためにはC問題までできればいいらしいので、この調子で頑張りたいです。

AtCoder で茶色コーダー、つまりレーティング 400 に到達するためには、
AtCoder Beginner Contest の A, B 問題が確実に(大方 15 分以内で)解ける
AtCoder Beginner Contest の C 問題も簡単なものなら解ける

レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編:競プロを始めよう】 - Qiita