조카를 잠재우기 위해 달팽이 모양으로 숫자를 하나씩 적어주는 프로그램이 필요하게 되었다. 이를 위해 정사각형 모양의 달팽이 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 ^ <- <-
배열에 숫자가 출력되는 규칙은 다음과 같다.
- 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]]