一桁だと動いたコードが、多桁になった瞬間に崩壊。やっぱり文字列処理、奥深い!
🧪 問題概要
文字列で渡される数式(演算子は +
と -
のみ)を計算して、結果を出力せよ。
入力例:
781781+272-178781+3919-1737389
出力例:
-1130198
💥 NGコード例
const chars = Array.from(input); // 一文字ずつバラされる
こうすると、例 "781"
が ["7", "8", "1"]
にバラバラ…。
前回の一桁問題と同じようにやって失敗(´;ω;`)
✅ OKコード(正規表現で意味ごと抽出)
const numbers = input.match(/\d+/g).map(Number);
const operators = input.match(/[+-]/g);
let result = numbers[0];
for (let i = 0; i < operators.length; i++) {
result = operators[i] === "+" ? result + numbers[i + 1] : result - numbers[i + 1];
}
🔍 解説
-
\d+
:連続する数字 → 多桁でも1つの塊に -
[+-]
:+
か-
のどちらか → 記号だけ抽出 -
.match()
:文字列を「意味単位」で切り分けられる超便利メソッド! -
g
:global(全体) → 該当するすべてを対象に抽出!
☝️ 技術ポイントまとめ
- 数字と記号をロジック的に分離するには「正規表現 +
match()
」をつかう - 特に多桁対応では
\d+
が便利 -
split()
やArray.from()
では構造を失うリスクあり