コンテンツへスキップ

【Ruby基礎】AtCoder Beginner Contest 069 A – K-City

  • by

■はじめに

Rubyの基礎的な問題をたくさん解くことで基本的な考え方やメソッドの使い方を定着させたい。
基本的にはAtCoderというプログラミングコンテスト(競技プログラミング)の過去問を使う。(AtCoderは難易度が分かれており、難易度の低いA問題かB問題を解いていく)

(5/23時点の方針)
メソッドの切り分け方や値の受け渡しを練習するために、コード長の短さについては気にせずに書くことにする。

(2022/10/17時点の方針)
しばらくはB問題を小さい番号の方からやっていく。たまにA問題もやるかも。

■問題

●出典

AtCoder Beginner Contest 069のA問題
https://atcoder.jp/contests/abc069/tasks/abc069_a

●問題文

K 市には、東西方向に n 本の通りがあり、南北方向に m 本の通りがあります。 東西方向のそれぞれの通りは、南北方向のそれぞれの通りと交わっています。 東西南北を通りに囲まれた最小の領域を「街区」と呼びます。 K 市にある街区の個数を求めてください。

●制約

  • 2 ≤ n,m ≤ 100

●入力

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

n m

●出力

K 市にある街区の個数を出力せよ。

■回答

●愚直に書く

nとmから1ずつ引いてかければ良いか?

n, m = gets.split.map(&:to_i)
puts (n - 1) * (m - 1)

通った!

●メソッド化して書く

メソッドを作る練習のために、あえてそういう書き方をする。

def main
  n, m = read_nums
  puts calc_citys(n, m)
end

def calc_citys(n, m)
  (n - 1) * (m - 1)
end

def read_nums
  gets.split.map(&:to_i)
end

main

通った!

●リファクタリング/別アプローチ

標準入力を取る時点で-1しても良いかな?
mapの部分の書き方もちょっと変わる。

n, m = gets.split.map{|x| x.to_i - 1}
puts n * m

通った!

●他の方の回答例

injectのたたみ込み演算、足し算だけじゃなく掛け算もいけるのか。

puts gets.split.map{|x| x.to_i - 1}.inject(:*)

●出てきたメソッド等

公式リファレンスを見る訓練。

■振り返りなど

標準入力を取る時点で-1するのに気づけて良かった。とはいえ、極端にこういう圧縮した書き方がわかりやすいかというと怪しい気もする。