配列への副作用を伴う操作

配列活用メニュー【配列の順序の反転・変数の入れ替え・指定要素の入れ替え・要素の追加・削除・九九表・重複要素の削除 ほか】

【STEP: 1】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const A = [];  // 元の配列
   for (let i = 1; i <= N; i++) {
      A.push(Number(lines[i]));
   }
   const B = [...A].reverse();  // 配列 AB の要素として展開→逆順ソート
   B.forEach(b => {
      console.log(b);  // Bの各要素を表示
   });
});
hogeちゃんの画像

スプレット構文(...A)で A の値を配列 B の要素として展開して reverse()で 逆順に並べ替えました。

【STEP: 2】コード

reader.on('close', () => {
   let [X, Y] = lines[0].split(' ').map(Number);
   [X, Y] = [Y, X];  // 順序を入れ替えて値の交換
   console.log(X, Y);
});
hogeちゃんの画像

配列の要素の順序を入れ替えるだけで 値の交換ができました。

【STEP: 3】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const [X, Y] = lines[N + 1].split(' ').map(Number);
   const A = [];
   for (let i = 1; i <= N; i++) {
      A.push(Number(lines[i]));
   } 
   [A[X - 1], A[Y - 1]] = [A[Y - 1], A[X - 1]];
   A.forEach(a => {
      console.log(a);
   });
});
hogeちゃんの画像

配列の要素の入れ替えも 左辺・右辺で順序を入れ替えれば OKでした。

【STEP: 4】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const B = lines[N + 1];
   const A = [];
   for (let i = 0; i < N; i++) {
      A[i] = lines[i + 1];
   } 
   A.push(B);
   A.forEach(a => {
      console.log(a);
   });
});
hogeちゃんの画像
push()A の末尾に B を追加。

【STEP: 5】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const [n, B] = lines[N + 1].split(' ').map(Number);
   const A = [];
   for (let i = 0; i < N; i++) {
      A[i] = lines[i + 1]; }
   A.splice(n, 0, B);  // splice(開始位置,削除数,追加する要素)
   A.forEach(a => {
      console.log(a);
   });
});
hogeちゃんの画像

splice(位置, 削除数0, 追加する要素)で要素の追加ができました。

【STEP: 6】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const n = lines[N + 1];
   const A = [];
   for (let i = 1; i <= N; i++){
      A[i - 1] = lines[i];
   }
   A.splice(n - 1, 1);  // splice(開始位置,削除数)
   A.forEach(a => {
      console.log(a);
   });
});
hogeちゃんの画像

splice(n(位置), 1(削除数))番目の要素を削除することができました。

【STEP: 7】コード

const A = [];
for (let i = 0; i < 9; i++) {
   A.push([i + 1]);  // 1 列目(1〜9)
   for (let j = 1; j < 9; j++) {
      A[i].push(A[i][0] + A[i][j-1]);  // i 行目
   }
}
A.forEach(a => {
  console.log(a.join(' '));
});
hogeちゃんの画像

2次元配列の九九表です。

【STEP: 8】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const A = [];
   for (let i = 1; i <= N; i++) {
      A.push(Number(lines[i]));
   }
   for (let i = 1; i < N; i++) {
      for (let j = 0; j < i; j++) {
   // A[1]*A[0] → A[2]*A[0] → A[2]*A[1] 〜 A[N-1]*A[N-2]
         console.log(A[i] * A[j]);
      }
   }
});
hogeちゃんの画像

出力の順番が指定されているので指示通り表示されるように 2重ループで出力しました。

【STEP: 9】コード

reader.on('close', () => {
   const [N, n] = lines[0].split(' ').map(Number);
   const A = [];
   const B = new Array(n).fill(0);  // B の初期値は n 個の 0
   for (let i = 1; i <= N; i++) {
      A.push(Number(lines[i]));
   }
   for (let i = 0; i < Math.min(N, n); i++) {  // i の範囲は(N, n)の小さい方未満まで
      B[i] = A[i];  // B[i] を A[i] で上書き
   }
   B.forEach(b => {
      console.log(b);
   });
});
hogeちゃんの画像

n 個 の 0を保持する配列 Bを宣言。カウンタ変数 i の範囲をABの要素数の小さい方未満までとし B[i] の値を A[i]で上書きしています。

【STEP: 10】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const A = [];
   for (let i = 1; i <= N; i++) {
      A.push(Number(lines[i]));
   }
   const S = new Set(A);  // Set() に同じ値は保存できない→重複は削除される
   const B = [...S];  // Set() の 値を展開して 新配列 B を生成
   B.forEach(b => {
      console.log(b);
   });
});
hogeちゃんの画像

Set() の仕様を利用して 配列 A の要素の重複を削除しました。そして S の値を 配列 B の要素として展開 しています。

【FINAL】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   const A = [];  // 元の配列
   const B = [];  // K 以上の要素を抽出した 配列
   for (let i = 1; i <= N; i++) {
      A.push(Number(lines[i]));
   }
   for (let i = 0; i < N; i++) {
      if (A[i] >= K) {  // A[i] が K 以上なら…
        B.push(A[i]);  // BA[i] を追加
      }
   }
   B.forEach(b => {
     console.log(b);
   });
});
hogeちゃんの画像

for文 で A の要素に順次アクセスし K 以上であれば B の要素として保存。

コメント