株売買問題を通して、
-
if-elseとif-elsifの違い -
(n - 1).timesの書き方と可読性
について整理しました。
✅ 完成コード
n, buy, sell = gets.split.map(&:to_i)
tickets = 0
benefit = 0
(n - 1).times do
price = gets.to_i
if price <= buy
tickets += 1 #持ち株枚数が増える
benefit -= price #購入額分利益から引く
elsif price >= sell
benefit += tickets * price #持ち株枚数*株価を利益に足す
tickets = 0 #チケット枚数リセット
end
end
final_price = gets.to_i
benefit += tickets * final_price
puts benefit
📚学び① (n - 1).times は「意味」より「可読性」
今回の処理は
- 最終日(N日目)は特別ルール
- それ以前の N-1 日だけ通常ルール
そのため
(n - 1).times do
としている。
❓ なぜ括弧を付けるのか?
Ruby では
n-1.times
と書いても動く。
しかし、
-
n - 1がまとまりなのか -
1.timesがまとまりなのか
が一瞬分かりづらい。
そこで
(n - 1).times
と書くことで
「n から 1 を引いた回数だけ繰り返す」
という意図が明確になる。
実際、最初はカッコなしで書いており、
最終株価final_priceがちゃんと取得できているか確認したところ、
2回目の株価を取得してしまっていた。
つまりn-1.times doは1回目しか処理されていなかった。
可読性とは「人間の目線でコードが見やすいかどうか?」のことを言うのかと勘違いしていたけど、
実際は『コンピューターが正確に処理できるかどうか?』ということだった。
📚 学び② if-else と if-elsif の違い
今回のルールは3パターンある。
- price <= buy → 買う
- price >= sell → 売る
- それ以外 → 何もしない
❌ if-else だとどうなる?
if price <= buy
買う
else
売る
end
この場合、
buy < price < sell
でも売ってしまう。
👉 2択しか作れない。
✅ if-elsif なら?
if price <= buy
買う
elsif price >= sell
売る
end
この形なら
- 条件① → 買う
- 条件② → 売る
- どちらでもない → 何もしない
👉 自然に3択になる。
🎯 違いまとめ
| 書き方 | 条件に当てはまらない場合 |
|---|---|
| if-else | 必ず else 実行 |
| if-elsif | 何もしない |
🚀 まとめ
今回の学び:
-
(n - 1).timesは動作よりも「意図を明確にする書き方」 -
if-elseは2択 -
if-elsifは3択以上対応
学習メモとして記録。