今回は paiza の「「値の計算」を解くために:part3」の問題に挑戦!
問題概要
テーマ: 抵抗回路の合成抵抗を求める(今回は 直列のみ)。
入力:
-
N
:抵抗の種類数 -
s_i w_i
:抵抗名とその抵抗値(N行分) -
M
:回路に並べる抵抗の個数 -
t_1 ... t_M
:回路に並べる抵抗名の並び(直列接続)
計算ルール:
- 直列接続の場合:
- 抵抗値は単純に合計する
(例: A=100Ω, B=200Ω を A-B-B 直列に → 100+200+200 = 500Ω)
出力:
- 回路全体の合計抵抗値(小数点以下は切り捨て)
入力例:
2
A 100
B 200
3
A B B
出力例:
500
✅ OK例:
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
// --- 1. 入力の取得 ---
const N = Number(lines[0]); // 抵抗の種類数
// 抵抗名と抵抗値を Map に格納
const sw = new Map(lines.slice(1, N+1).map(line => {
const [s, w] = line.split(' ');
return([s, Number(w)]);
}));
const M = Number(lines[N+1]); // 抵抗の個数
const t = lines[N+2].split(' '); // 直列のつなぎ方(例: ["A", "B", "B"])
// --- 2. 直列合計の計算 ---
let ans = 0;
t.forEach(a => {
ans += sw.get(a); // 抵抗名に対応する抵抗値を加算
});
// --- 3. 出力 ---
console.log(ans);
});
入力を読み取る準備
-
readline
で標準入力を受け取り、lines
配列に格納していく。
入力の基本情報を取得
-
N = Number(lines[0])
→ 抵抗の種類数を数値として取得。
抵抗の種類と値を Map
に格納
-
lines.slice(1, N+1)
でN
行分を取り出す。 - 各行を "抵抗名 抵抗値" に分割。
-
Map
に[抵抗名, 抵抗値]
のペアを登録。
→Map
なのでキー(抵抗名)から素早く値を取り出せる。
直列接続する抵抗の情報を取得
-
M = Number(lines[N+1])
→ 直列に繋ぐ個数を取得。 -
t = lines[N+2].split(' ')
→ 実際の並び(例:["A", "B", "B"]
)を配列に。
合計抵抗値を計算
- 初期値
ans = 0
。 -
t.forEach(a => ans += sw.get(a))
→ 並びに従って抵抗名から値を取り出し、どんどん加算。
結果を出力
-
console.log(ans)
で合計抵抗値を出力。
✅ OK例:オブジェクト版
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
// --- 1. 入力の取得 ---
const N = Number(lines[0]); // 抵抗の種類数
// 抵抗名と抵抗値をオブジェクトに格納
const sw = {};
for (let i = 1; i <= N; i++) {
const [s, w] = lines[i].split(' ');
sw[s] = Number(w); // ← 動的にキーを追加
}
const M = Number(lines[N+1]); // 抵抗の個数
const t = lines[N+2].split(' '); // 直列のつなぎ方(例: ["A", "B", "B"])
// --- 2. 直列合計の計算 ---
let ans = 0;
t.forEach(a => {
ans += sw[a]; // オブジェクトのキーアクセス
});
// --- 3. 出力 ---
console.log(ans);
});
-
sw[s] = Number(w)
→ ブラケット記法で 文字列キーを動的に追加している。
(例: "A" → 100, "B" → 200 みたいな対応表) -
sw[a]
→ 配列t
に入っている抵抗名をキーとして取り出し。
Map 版のsw.get(a)
に相当。
📝まとめ
- 標準入力の処理
-
readline
を使ってすべての行をlines[]
に格納。
-
- データ構造の選択
-
Map
版:sw.get(key)
で取り出す。 - オブジェクト 版:
sw[key]
で取り出す。 - 両者とも「名前 → 値」の対応表(辞書)を作れる。
-
- 入力データの整理
- 種類部分は
lines.slice(1, N+1)
でまとめて処理。 - 回路の並びは
lines[N+2].split(' ')
で配列化。
- 種類部分は
- 直列計算の実装
- 合計変数
ans = 0
を用意。 -
t.forEach(a => ans += sw[a])
で抵抗名を値に変換しながら加算。
- 合計変数
- 出力
-
console.log(ans)
で結果を出す。
-
🔑 ポイント
- 辞書構造(Map/オブジェクト)で「名前 → 値」の対応を管理する。
- 直列は足し算だけでシンプルに処理できる