今回は paiza の「文字と整数の組のソート」の問題に挑戦!
問題概要
〇入力
- 1行目:整数
n(組の個数) - 続く
n行:S_i D_i(文字と整数の組、空白区切り)- 文字
S_iは重複なし - 数字
D_iも重複なし
- 文字
〇出力
- 整数
D_iの昇順に並べ替えたときのS_iを1行ずつ出力
入力例:
2 // n
A 1 // S_1 D_1
B 2
出力例:
A
B
✅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 map = new Map();
for(let i = 1; i <= n; i++){
const char = lines[i].split(' ')[0];
const num = Number(lines[i].split(' ')[1]);
map.set(num, char);
}
const sorted = [...map.keys()].sort((a,b) => a-b);
sorted.forEach(s => console.log(map.get(s)));
});
- 文字
charと 整数num
-
Mapに格納-
numをキー、charを値としてmapに登録。 map.set(num, char);
-
- キー(整数)の並べ替え
-
[...map.keys()]で番号だけ取り出した配列をつくる。 -
sort((a,b) => a-b)で昇順に並べ替え。
-
-
結果の出力
- 並べ替え済みの番号を順番に見て、対応する
charをmap.get()で出力。
- 並べ替え済みの番号を順番に見て、対応する
✅OK例 2:
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 arr = lines.slice(1, n + 1).map(line => {
const [char, num] = line.split(' ');
return { char, num: Number(num) };
});
arr.sort((a, b) => a.num - b.num);
arr.forEach(({ char }) => console.log(char));
});
-
lines.slice(1, n + 1)→n行分のデータだけを切り出す。
-
配列に変換
-
.map()を使って各行を{ char, num }形式のオブジェクトに変換。 -
例:
"A 3"→{ char: "A", num: 3 }
-
-
並べ替え
-
arr.sort((a, b) => a.num - b.num)でnum昇順にソート。
-
-
出力
-
forEach(({ char }) => console.log(char))でcharだけ順番に出力。
-
✅さらに短縮版
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', (l) => lines.push(l));
rl.on('close', () => {
lines.slice(1).map(l => l.split(' '))
.map(([char, num]) => [Number(num), char])
.sort((a, b) => a[0] - b[0])
.forEach(([_, char]) => console.log(char));
});
-
データ整形
-
lines.slice(1)
→ 1行目(件数n)をスキップしてデータ部分だけ取り出す。 -
.map(l => l.split(' '))
→"A 3"→["A", "3"] -
.map(([char, num]) => [Number(num), char])
→[3, "A"]のように[整数, 文字]の配列に変換。
-
-
並べ替え
-
.sort((a, b) => a[0] - b[0])
→ 配列の最初の要素(整数)で昇順ソート。
-
-
出力
-
.forEach(([_, char]) => console.log(char))
→[num, char]の「2番目の要素」だけを出力。 -
_は「ここは使わない変数」の意味。
-
📝 まとめ
- データ構造
-
Mapを使う方法:numをキー、charを値に格納 - 配列を使う方法:
{ char, num }または[num, char]の形で格納
-
- 並べ替え
-
.sort((a, b) => a.num - b.num)(オブジェクト配列) -
.sort((a, b) => a[0] - b[0])(ペア配列)
-
- 出力
-
Mapならmap.get(key) - 配列なら
forEach(({ char }) => console.log(char))
-
- 書き方の工夫
- 配列版は短縮してチェーンメソッドで書ける
-
_は「未使用の変数」として無視できる
- ポイント
- 配列・オブジェクト・Map いずれも「ソートして値を取り出す」という考え方は同じ
- コードの簡潔さ vs 読みやすさで選択可能