二重ループ:基本編

二重ループメニュー【指定された範囲・行数の数字の出力・二次元配列での要素の検索・最大の要素・行ごとの和・積の最大 ほか】

【STEP: 1】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   const A = [];
   for (let i = 1; i <= N; i++) {
      A.push(i);  // Ai(1〜N)を追加
   }
   console.log(A.join(' '));  // 連結して出力
});
hogeちゃんの画像

for文で カウンタ変数 i の値を配列 A に保存後 join(' ') で 値を連結して出力しました。

【STEP: 2】コード

reader.on('close', () => {
   const N = Number(lines[0]);
   for (let i = 1; i <= N; i++) {
      console.log(i);  // i(1〜N)を出力
   }
});
hogeちゃんの画像

カウンタ変数 i の値を for文 でループしながら出力しました。

【STEP: 3】コード

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

1〜5 の値を持つ配列 AN  回出力 しています。

【STEP: 4】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   for (let i = 1; i <= K; i++) {
      const A = [];
      for (let j = 1; j <= N; j++) {
         A.push(j);
      }
      console.log(A.join(' '));
   }
});
hogeちゃんの画像
1〜N の値を持つ配列 AK 行出力。

【STEP: 5】コード

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

2次元配列化しましたが 出力は join(' ') を使ったので2重ループにはならなかった…。(^_^;

【STEP: 6】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   for (let i = 1; i <= N; i++) {
      const A = lines[i].split(' ').map(Number);
      for (let j = 0; j < K; j++) {
         if (A[j] === 1) {
            console.log(i, j + 1);
            break;
         }
      }
   }
});
hogeちゃんの画像

最初のループで lines[i]を配列に変換して A に保存。2つ目のループで A の各値にアクセスし 1 であれば ij + 1 を表示しています。

【STEP: 7】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   let max = 0;
   for (let i = 1; i <= N; i++) {
      const A = lines[i].split(' ').map(Number);
      for (let j = 0; j < K; j++) {
         if (A[j] > max) {
            max = A[j];
         }
      }
   }
   console.log(max);
});
hogeちゃんの画像

最初のループで lines[i]を配列に変換して A に保存。2つ目のループで A の各値にアクセスして 変数 max より大きければ max の値を更新しました。

【STEP: 8】コード

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

便利な reduce() 使ってます。

【STEP:9】コード

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

問題の趣旨と合わないような気がしますが 入力の最初の値を削除して 要素の和を出力しています。。

【STEP:10】コード

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

A の 値を増やしながら出力しています。

【FINAL】コード

reader.on('close', () => {
   const [N, K] = lines[0].split(' ').map(Number);
   const A = lines[1].split(' ').map(Number);
   const B = lines[2].split(' ').map(Number);
   let max = -100 * 100;  // max の初期値は入力条件の 最小 ✕ 最大
   for (let i = 0; i < N; i++) {
      for (let j = 0; j < K; j++) {
         const n = A[i] * B[j];
         if (n > max) {
            max = n;
         }
      }
   }
   console.log(max);   
});
hogeちゃんの画像

出力値の初期値は 入力条件の範囲内での 積の最小値に設定しました。2重ループで全ての積の結果を比較して max より大きければ max を上書きしています。

コメント