2차원 달팽이 배열

rlorxl·2022년 2월 14일
0

문제

조카를 잠재우기 위해 달팽이 모양으로 숫자를 하나씩 적어주는 프로그램이 필요하게 되었다. 이를 위해 정사각형 모양의 달팽이 2차원 배열을 그려주는 함수를 작성하시오. 입력한 크기의 정사각형으로, 시계방향을 돌면서 숫자를 채워 2차원 배열을 반환한다.

풀이

먼저 2차원의 배열을 선언해 주어야 한다. 2차원 배열을 생성하는 방법은 여러가지인데 반복문을 사용해서 배열을 만들었다. (length=입력된 숫자)

let result = new Array(length); 
for(let i = 0; i < result.length; i++){
     result[i] = new Array(length);
}

입력된 숫자가 3일때 출력될 배열은 [[1,2,3],[8,9,4],[7,6,5]]이다.

1 2 3 	 -> -> v
8 9 4  	 ^  -> v
7 6 5  	 ^ <- <-  

배열에 숫자가 출력되는 규칙은 다음과 같다.

  1. 배열의 첫 인덱스에 왼쪽->오른쪽으로(x축 방향) 입력된 숫자의 길이만큼 출력된다.
  2. 입력된 길이만큼 숫자가 출력되면 (가로 방향이 끝나면) 방향을 바꿔 출력한다(y축 아래).
  3. y축 방향의 마지막에 다다르면 숫자를 왼쪽으로(x축) 출력한다.
  4. x축 방향의 마지막에 다다르면 숫자를 위쪽으로(y축) 출력한다.
  5. x축에서->y축으로 방향을 바꿀때는 입력된 숫자의 길이를 -1만큼 줄인다.
  6. 입력된 숫자의 길이가 0이되면 출력을 마친다.
  • x축 방향으로 움직이며(같은 인덱스의 배열 안에서) 배열에 숫자를 입력해주는 코드와,
  • y축 방향으로 움직이며(다른 인덱스의 배열로 바꾸면서) 배열에 숫자를 입력해주는 코드
    두개가 필요하다.

코드

let input5 = [3,5,6];

function answer(length){
    let result = new Array(length);
    for(let i = 0; i < result.length; i++){
        result[i] = new Array(length);
    }

    let direction = 1; 
    let x,y,num;
    x = y = num = 0;
    x--; 
  
    while(1) {
        // x축
        for(let i = 0; i < length; i++){
            x += direction;
            result[y][x] = ++num; 
        }
      
        length--; 
        if(length == 0)break;

        // y축
        for(let j = 0; j < length; j++){
            y += direction;
            result[y][x] = ++num;
        }
        direction *= -1;
    }

    return result;
}

과정

첫번째 for문									  두번째 for문 (length=2)
result[0][0] = 1							  result[1][-1] = 4
result[0][1] = 2		>>   length-- 	>>	  result[2][-1] = 5
result[0][2] = 3

>> direction * -1

// result [[1,2,3],[empty,empty,4],[empty,empty,5]]

첫번째 for문 									  두번째 for문 (length=1)
result[2][-2] = 6		>>   length-- 	>>	  result[1][-3] = 8
result[2][-3] = 7

>> direction * -1

// result [[1,2,3],[8,empty,4],[6,6,5]]

첫번째 for문 
result[1][-2] = 9		>> 	 length--	>>	  (length == 0)으로 종료

// result [[1,2,3],[8,9,4],[6,6,5]]
profile
즐겜하는거죠

0개의 댓글