実装[Algorithm]:カタツムリの作成


💡 アルゴリズム実装問題に分類する.
質問する🛫
カタツムリを作る
正方形のカタツムリの形状の2次元配列を描くプログラムを実現します.
値の大きさの正方形を入力し、下図のように時計回りに回転して数字を塗りつぶして2 D配列を返します.example (input 4) : TestCaseInput
3
5
6
Output
#1 [1, 2, 3][8, 9, 4]
[7, 6, 5]
#2 [1, 2, 3, 4, 5][16,17,18,19,6]
[15,24,25,20,7][14,23,22,21,8]
[13,12,11,10,9]
ぶんせき
これは,配列順序によって値を与える繰返し文が変化すべき問題である.
複文のパターンをよく考えて体現しなければならない.
まず入力値num(長さ)x numの2次元配列を生成し,配列挿入方向が異なるたびに長さを1短くする.
必要な実施形態は以下の通りである.
1)numの長さで数字を入力します.
2)1行、num-i、方向転換、毎回2回記入します.(exnum=4の場合、(横4番)(縦3番横3番)(縦2番横2番).2回)
3)終了条件はlength == 0に答える📖
Solution (For Loop)
2つの1のfor loopを使用します.(第2話)
// 달팽이 그리기

// Solution
function answer(num) {
// 1. 배열 초기화 (자바스크립트에서는 배열 초기화를 이렇게 구현해야한다.)
  let result = new Array(num); 

  for (let i = 0; i < num; i++) {
    result[i] = new Array(num);
  }
  
  // 2. 변수 선언
  let direction = 1;
  let x, y, count;
  x = 0;
  y = 0;
  count = 0;
  x--; // 바로 아래 direction이 더해지기 때문에 index에 영향을 주지 않게 -1로 시작한다.(최초 수행을 위해)

  // 3. 반복문 수행
  while (1) {
    for (let i = 0; i < num; i++) {
      x += direction;
      result[y][x] = ++count;
    }

    num--;

    if (num === 0) break;

    for (let j = 0; j < num; j++) {
      y += direction;
      result[y][x] = ++count;
    }

    direction *= -1; // 방향을 바꿔준다.
  }


  return result;
}


// TC
let input = [
  3, 5, 6
]

for (let i = 0; i < input.length; i++) {
  process.stdout.write(`#${i + 1} `);
  console.log(answer(input[i]));
}
Review 💡
単純な配列探索問題であるが,配列空間に対する理解度を高めることができる.これにより、以降のノードdfs、bfsの実現に寄与する.