2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】each_cons / map / abs を使って「移動距離の合計」を求める

2
Posted at

今回は階層移動の問題を通して学んだ、以下3つのメソッドにフォーカスします。

  • each_cons(n)
  • map
  • abs

テーマは「隣り合う階の差分の絶対値を合計する」です。


📌 問題概要

エレベーターは最初に 1階 にいる。

ログとして停止した階が順番に与えられるので、

エレベーターが合計で何階分移動したかを求める


🧩 解法コード

counts = gets.to_i

floors = [1]

counts.times do
  floors << gets.to_i
end

puts floors.each_cons(2).map { |a, b| (a - b).abs }.sum

✅ 学び① each_cons(n) とは?

each_cons(n)

連続した n 個の要素を取り出すメソッド

consconsecutive(連続した) の略。


[1, 3, 1, 4].each_cons(2)

内部的にはこうなる:

[1, 3]
   [3, 1]
      [1, 4]

つまり

「スライドする窓」

のイメージ。


each_slice との違い

メソッド 動き
each_cons(2) 1個ずつスライド
each_slice(2) 2個ずつ区切る
[1,2,3,4].each_slice(2)
→ [1,2], [3,4]

差分問題では each_cons が最適


✅ 学び② map とは?

map

各要素を変換して「新しい配列を作る」メソッド


[1,2,3].map { |x| x * 2 }

[2,4,6]

今回の使い方

map { |a, b| (a - b).abs }
  • each_cons が [a, b] を渡す
  • その差の絶対値を返す
  • 差分配列が作られる

今回、mapをしていなかったせいで期待した答えが返ってこずてこずりました。。。


✅ 学び③ abs とは?

abs

absolute value(絶対値)


(-3).abs

3

なぜ必要?

差分は

3 → 1 = -2

のようにマイナスになる。

でも移動距離は負にならない。

だから 絶対値が必要


🎯 処理の流れまとめ

floors = [1, 3, 1, 4]

① each_cons(2)

[1,3]
[3,1]
[1,4]

② map + abs

[2,2,3]

③ sum

7

🧠 今回の本質

  • each_cons → 隣り合う要素を取る
  • map → 新しい配列を作る
  • abs → 距離を正にする

この3つを組み合わせると、

「移動距離」や「隣接差分問題」は一瞬で解ける


📚 まとめ

メソッド 役割
each_cons 連続要素を取得
map 変換して配列生成
abs 絶対値取得

🌸感想

メソッドを使って使って息を吐くように唱えられるようになりたいな〜🧙‍♀️


※本記事は学習メモとしてまとめました。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?