このコードは、与えられた配列の要素を順位圧縮し、条件を満たすように変換します。
function compressArray(N, A) {
// 値のユニーク化とソート
let sortedUnique = [...new Set(A)].sort((a, b) => a - b);
// 値のマッピングを作成(値 -> 圧縮後のインデックス)
let rankMap = new Map();
sortedUnique.forEach((value, index) => {
rankMap.set(value, index + 1);
});
// 元の配列をマッピングに従って変換
let B = A.map((value) => rankMap.get(value));
console.log(B.join(' '));
}
// 標準入力からデータを取得し処理する
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on('line', (line) => {
input.push(line);
}).on('close', () => {
const N = parseInt(input[0], 10);
const A = input[1].split(' ').map(Number);
compressArray(N, A);
});-
ユニークな値を取得し、ソート
配列Aの要素をSetを使って重複を削除し、小さい順にソートします。 -
値ごとのランク(圧縮後の値)をマッピング
小さい順に1から番号を振り、マップ (rankMap) に格納します。 -
元の配列の各値をマッピングで変換
Aの各要素をrankMapから対応する値に変換し、新しい配列Bを作成します。 -
出力
Bをスペース区切りで出力します。
- ソート: (O(N \log N))
- マッピング: (O(N))
- 合計: (O(N \log N))
→ 十分高速に動作します (N ≤ 100000に対応可能)。