今回は paiza の「「値の計算」を解くために:part2」の問題に挑戦!
問題概要
- 入力
- 1行目に整数
N
(抵抗の種類数)。 - 続く
N
行に、抵抗名s_i
(アルファベット1文字)と抵抗値w_i
(整数)。 - 処理内容
- 抵抗名をキー、抵抗値をバリューとした連想配列(Map / オブジェクト)を作る。
- 抵抗名を アルファベット順にソート する。
- その順番で抵抗値を出力する。
- 1行目に整数
- 出力
- アルファベット順に並べた抵抗値を1つずつ改行して出力。
入力例:
2
A 100
B 200
出力例:
100
200
✅OK例:
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
const N = Number(lines[0]);
const sw = new Map(lines.slice(1).map(line => {
const [s, w] = line.split(' ');
return [s, Number(w)];
}));
const swSorted = [...sw.keys()].sort();
swSorted.forEach(key => console.log(sw.get(key)));
});
-
lines[0]
には最初の行の「抵抗の種類数」が入っているので数値に変換してN
に格納。 -
lines.slice(1)
で2行目以降を取得 → 抵抗名と抵抗値のペアが並ぶ。 -
map
で[s, Number(w)]
形式の配列を返す →[ "A", 100 ]
のようになる。 -
new Map([…])
とすると、抵抗名をキー、抵抗値をバリューとする連想配列(Map オブジェクト)が作られる。 -
sw.keys()
でMap
に入っているキー(抵抗名)を取り出す。 -
[…sw.keys()]
で配列化 →["A", "B"]
のようになる。 -
.sort()
でアルファベット順にソート。 - ソート済みのキーを順に取り出し、
sw.get(key)
で値(抵抗値)を取得して出力。 - 結果はアルファベット順の抵抗値だけが出力される。
✅OK例:オブジェクト版
const rl = require('readline').createInterface({ input:process.stdin });
const lines = [];
rl.on('line', (input) => lines.push(input));
rl.on('close', () => {
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 swSorted = Object.keys(sw).sort();
// 値を順に出力
swSorted.forEach(key => console.log(sw[key]));
});
- ブラケット記法 (
sw[s]
)で、動的にプロパティを追加、つまり、入力された抵抗名をそのままキーとして動的に格納している。 -
Object.keys(sw)
→ オブジェクトsw
の キー(プロパティ名)の配列 を取得 - あとは、1つ目のコードと同じで、ソートして、値を順に出力する。
📝まとめ
連想配列の作り方
-
Map
を使う →new Map([[key, value], ...])
- オブジェクトを使う →
obj[key] = value
(ブラケット記法で動的に追加)
キーの取得
-
Map → sw.keys()
でキーをイテレータ取得、[...sw.keys()]
で配列化 - オブジェクト →
Object.keys(obj)
で配列を取得
ソート
-
.sort()
は文字列として昇順ソートされる → 今回はアルファベット順になる
値の参照
- Map →
map.get(key)
- オブジェクト →
obj[key]