Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

README.md

このコードは、与えられた配列の要素を順位圧縮し、条件を満たすように変換します。

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);
});

解説

  1. ユニークな値を取得し、ソート
    配列 A の要素を Set を使って重複を削除し、小さい順にソートします。

  2. 値ごとのランク(圧縮後の値)をマッピング
    小さい順に 1 から番号を振り、マップ (rankMap) に格納します。

  3. 元の配列の各値をマッピングで変換
    A の各要素を rankMap から対応する値に変換し、新しい配列 B を作成します。

  4. 出力
    B をスペース区切りで出力します。

計算量

  • ソート: (O(N \log N))
  • マッピング: (O(N))
  • 合計: (O(N \log N))
    → 十分高速に動作します (N ≤ 100000 に対応可能)。