INDEX
■はじめに
Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)
(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。
(2022/10/17時点の方針)
しばらくはB問題を小さい番号の方からやっていく。たまにA問題もやるかも。
■問題
●出典
AtCoder Beginner Contest 005のB問題
https://atcoder.jp/contests/abc005/tasks/abc005_2
●問題文
高橋君は試作したたこ焼きを食べることにしました。
高橋君は熱々のたこ焼きが好きなので、できてすぐのたこ焼きから食べます。
それぞれのたこ焼きが何秒前にできたかが与えられるので、一番できたてのたこ焼きが何秒前にできたか出力して下さい。
●入力
入力は以下の形式で標準入力から与えられる。
N
T1
T2
:
TN
- 1行目にたこ焼きの個数を表す整数 N(1≦N≦100) が与えられます。
- 続く N 行にはそれぞれのたこ焼きが何秒前にできたかを表す整数 Ti (1≦Ti ≦100) が与えられます。
●出力
一番できたてのたこ焼きが何秒前にできたか出力して下さい。
また、出力の末尾には改行を入れて下さい。
■回答
●愚直に書く
きっとmin
でいけるやつだ。
n = readlines
p n.map{|m| m.to_i}.min
あれ、WA
になってしまう。
よくよく見たら、1行目はたこ焼きの個数で、2行目以降の数字で判定しないといけなかった…!
1行目は取得だけしておいて使わない、という作戦で行けそうか。
n = gets
t = readlines
p t.map{|m| m.to_i}.min
通った!
●リファクタリング/別アプローチ
上の解法では1行目をスルーしたが、ループの練習のために1行目で取得した回数分ループを回すという方法を考えた。
n = gets.to_i
t = n.times.map do |x|
x = gets.to_i
end
puts t.min
通った!times
とmap
を組み合わせることで変数tに配列で入れられたのでうまく行った。
●メソッド化して書く
メソッドを作る練習のために、あえてそういう書き方をする。
def main
t = read_takos
puts t.min
end
def read_times
gets.to_i
end
def read_takos
n = read_times
n.times.map do |x|
x = gets.to_i
end
end
main
通った!んだけど、あんまりわかりやすくはないかもな。。。時間もかかってしまったので今回はこれで良しとしておこう。
●他の方の回答例
drop
という初めて見るメソッドを使っている方がチラホラいた。
配列の先頭の n 要素を捨てて、残りの要素を配列として返す
らしい。
今回で言うと、初めの解法で標準入力の1行目が不要なのでdrop
で消してmin
すれば標準入力を取るのがシンプルになるのか、なるほど〜。
自分の回答に当てはめると、
# 1行目の処理がうまく行っていないのでWAになった例
n = readlines
p n.map{|m| m.to_i}.min
# 1行目をdropした例
n = readlines
p n.map{|m| m.to_i}.drop(1).min
下のコードで通った!
●出てきたメソッド等
公式リファレンスを見る訓練。
■振り返りなど
drop
を知れて良かった。便利なメソッドがたくさんあるんだなぁ。