コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 005 B – おいしいたこ焼きの食べ方

  • by

■はじめに

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

通った!timesmapを組み合わせることで変数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を知れて良かった。便利なメソッドがたくさんあるんだなぁ。