0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「値の計算」を解くために:part3

Posted at

今回は 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/オブジェクト)で「名前 → 値」の対応を管理する。
  • 直列は足し算だけでシンプルに処理できる

僕の失敗談(´;ω;`)と解決法🐈

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?