今回は階層移動の問題を通して学んだ、以下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 個の要素を取り出すメソッド
cons は consecutive(連続した) の略。
例
[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 | 絶対値取得 |
🌸感想
メソッドを使って使って息を吐くように唱えられるようになりたいな〜🧙♀️
※本記事は学習メモとしてまとめました。