Javascript/자바스크립트 문제

[Javascript : programmers] 정수를 나선형으로 배치하기 (Lv.0) 💥💥

isfp_yykkng 2024. 8. 31. 14:51

[Javascript : programmers] 정수를 나선형으로 배치하기 (Lv.0) 💥💥

 

문제

 

이 문제는 풀지 못했고, 다른 사람의 풀이를 통해서 알고리즘을 학습하기로 한다.

 

다른 사람 풀이

function solution(n) {
    let answer = new Array(n).fill().map(()=>new Array(n).fill(0));
    const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
    let x = 0, y = 0, dir = 0, num = 1;
    while(num <= n**2) {
        answer[x][y] = num;
        let nextX = x + move[dir][0];
        let nextY = y + move[dir][1];
        if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || answer[nextX][nextY] !== 0) {
            dir = (dir + 1) % 4;
            nextX = x + move[dir][0];
            nextY = y + move[dir][1];
        }
        x = nextX;
        y = nextY;
        num++;
    }
    return answer;
}

 

풀이 학습

1) n * n 까지 넣을 n * n 의 이차원 배열과 이차원 배열의 인덱스에 따라 상하좌우로 움직일 move 배열을 선언한다.

const answer = Array.from(Array(n), () => Array(n).fill(0));
const move = [[0, 1], [1, 0], [0, -1], [-1, 0]]; //우, 하, 좌, 상

 

 

2) num 이 배열의 크기인 n * n 보다 작거나 같을 때까지 반복한다.

while(num <= n**2) {
	answer[x][y] = num;
  	// 조건
}

 

 

3) 나선형 배치의 첫 방향은 우측이기 때문에 dir = 0 으로 move[0] 이고, num = 1 로 초기화 되어 있다. 

 

이를 토대로 move 를 통한 이동값에 현재 위치값 x, y를 더해서 다음 위치값을 구한다. ( 현재 move[0]으로 다음 x,y 는 0,1 )

let nextX = x + move[dir][0];
let nextY = y + move[dir][1];

 

 

4) 다음 위치값 nextX, nextY 의 값이 n 이 0 미만, n 이상일 경우이거나 다음값이 0이 아니면 (이미 숫자가 존재) 나머지 연산으로 dir 의 이동 방향을 선택한다. ( 방향이 움직이는 순서는 나선형 배치와 마찬가지로 우 > 하 > 좌 > 상 이다. )

if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || answer[nextX][nextY] !== 0) {
    dir = (dir + 1) % 4;
    nextX = x + move[dir][0];
    nextY = y + move[dir][1];
}

 

 

5) 이렇게 설정된 다음 좌표 위치에 1 증가된 num을 저장하면서 반복한다.

x = nextX;
y = nextY;
num++;

 

 


 

<참고>

https://velog.io/@scroll0908/Lv.0-%EC%A0%95%EC%88%98%EB%A5%BC-%EB%82%98%EC%84%A0%ED%98%95%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%B9%98%ED%95%98%EA%B8%B0