Paizaの「paiza商店の商品価格」問題を解いたときの学び💡
Map
って、こんなに使いやすかったんだ…!
🧾 問題概要:paiza商店でお買い物
- N個の商品(名前と価格)が与えられる
- M個の商品名が書かれた「お買い物リスト」が与えられる
- 各商品について、商店にあれば価格を、なければ -1 を出力する
入力例:
3 4
eraser 50
pencil 30
book 100
book
eraser
pencil
margaret
出力例:
100
50
30
-1
△NGかも例(注意)
priceMap.set(productName, price); // ❌ 価格が文字列のまま
このままだと「計算したいとき」に困る!
例えば合計金額出すときに '100' + 50 で 150 じゃなくて 10050 になる(爆)
なので、ちゃんと Number()
で数値変換が必要。
priceMap.set(productName, Number(price)); // ⭕️安全!
✅?? を使った方がシンプル!
priceMap.has(item) ? priceMap.get(item) : -1; // ⛔
priceMap.get(item) ?? -1; // ⭕ 短くて読みやすい
.get()
は見つからないと undefined
を返すから、??
と組み合わせるだけでOK!
💻 コード全体(コメント付き)
const rl = require("readline").createInterface({ input: process.stdin });
const lines = [];
// 標準入力を1行ずつ配列に格納
rl.on("line", (input) => {
lines.push(input);
});
rl.on("close", () => {
// 1行目: 商品数N、お買い物リスト数Mを数値に変換して取得
const [N, M] = lines[0].split(" ").map(Number);
// 商品名と価格を格納するMap(辞書)を作成
const priceMap = new Map();
// N個の商品をMapに登録(価格は数値に変換)
for (let i = 1; i <= N; i++) {
const [productName, price] = lines[i].split(" ");
priceMap.set(productName, Number(price));
}
// お買い物リストの部分を取得(N+1行目〜末尾まで)
const shoppingList = lines.slice(N + 1);
// 各商品について、価格を取得(なければ -1)して配列に
const results = shoppingList.map(item =>
priceMap.get(item) ?? -1
);
// 結果をまとめて出力
console.log(results.join('\n'));
});
🔍 技術メモ & まとめ
-
Map
はJSの辞書操作で適している。構文もシンプル。 -
.set()
時にNumber(price)
を忘れるとバグのもと。 -
.has()
よりget() ??
の方がスッキリ書ける。 - 結果は
join('\n')
で一気に出力 → パフォーマンスも良き。