PaizaのSet
問題で、数値が昇順にならないバグに直面しました。原因は .sort()
の仕様と BigInt
の特性にあった!
🧪 問題の概要
2つの数列A
, B
与えられ、それぞれの値を重複なく昇順で出力せよ。
入力例:
3
1 2 3
3 4 5
出力例:
1 2 3 4 5
💥 NGコード:文字列としてソートされる罠
const arrA = lines[1].split(' ');
const arrB = lines[2].split(' ');
const seen = new Set([...arrA, ...arrB]);
console.log([...seen].sort().join(' '));
→ 出力が 10 2 3
みたいに崩壊。
なぜ?→ .sort()
のデフォルトは文字列ソートだから。
✅ OKコード:BigInt+比較関数
const arrA = lines[1].split(' ').map(BigInt);
const arrB = lines[2].split(' ').map(BigInt);
const seen = new Set([...arrA, ...arrB]);
const sorted = [...seen].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
console.log(sorted.join(' '));
✔ 解説
✅BigInt
型で巨大な数にも対応
✅.sort()
に比較関数が必須(デフォは文字列比較)
✅a - b
はNG → BigInt - BigInt = BigInt
なので戻り値が 、
Number
じゃなくて型エラー
📌 技術メモ
-
new Set([...])
は重複除去に便利 -
.sort()
は数値比較を明示しないとバグる -
BigInt
使うならmap(BigInt)
+ 比較関数必須