今回は paiza の「数列並べ」の問題に挑戦!
🧩 問題概要
- 整数からなる 数列
Aが与えられる -
Q個のクエリが順番に与えられる - 各クエリは
-
ijという形 -
A_iとA_jの値を入れ替える操作を表す
-
- クエリは 順番通りに処理する
- すべてのクエリを処理し終えたあとの最終的な数列
Aを出力する
📥 入力
- 1行目:数列の長さ
N - 2行目:数列
A_1 A_2 ... A_N - 3行目:クエリの数
Q - 4行目以降:
- 各行に
ij(入れ替える位置)
- 各行に
📤 出力
- すべてのクエリ処理後の数列を出力する。
- 空白区切り
- 1行
入力例:
5
1 2 3 4 5
1
1 4
出力例:
4 2 3 1 5
✅ OK例:
const rl = require('readline').createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const N = Number(lines[0]);
const arrA = lines[1].split(' ').map(Number);
const Q = Number(lines[2]);
const query = lines.slice(3).map(q => q.split(' ').map(Number));
for (let i = 0; i < Q; i++) {
const [a, b] = query[i];
// 入れ替え前を記録
const A = arrA[a-1];
const B = arrA[b-1];
// 入れ替え
arrA[a-1] = B;
arrA[b-1] = A;
}
// 結果を出力
console.log(arrA.join(' '));
});
🔍 コードの流れ
- 標準入力を1行ずつ読み取り、配列
linesに保存する - 入力がすべて読み終わったら
closeが呼ばれる - 1行目から 数列の長さ
Nを取得 - 2行目から 数列
Aを配列として取得 - 3行目から クエリ数
Qを取得 - 4行目以降から 入れ替えクエリ (
a,b) を配列として取得 - クエリを1つずつ処理する
- 指定された位置
aとbの要素を入れ替える(1始まりなので-1する)
- 指定された位置
- すべてのクエリ処理後の数列を 空白区切りで出力する
✨ 分割代入で入れ替え
[arrA[a-1], arrA[b-1]] = [arrA[b-1], arrA[a-1]];
🗒️ まとめ
- 配列の要素を指定の位置で操作する問題。
- 1-indexed ⇔ 0-indexedに注意。
- 変数を使った入れ替えと、分割代入による簡潔な入れ替えの書き方がある。