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?

文字と整数の組のソート

Posted at

今回は 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) で昇順に並べ替え。

  • 結果の出力

    • 並べ替え済みの番号を順番に見て、対応する charmap.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 読みやすさで選択可能




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

0
0
1

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?