Lv.0 - 정수를 나선형으로 배치하기

송철진·2023년 5월 17일
0

문제

문제 설명
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.

제한사항
1 ≤ n ≤ 30

입출력 예

nresult
4[[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
5[[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]]

생각하기

처음에 생각해낸 규칙은 arr[i][j]에 대해서

  1. j를 n-1만큼 증가시키면서 값을 할당
  2. 다음의 조건을 반복한다 -> n===1 && j였을 때 반복문 종료
    • 이전에 j가 증가했으면 다음엔 i가 증가
    • 이전에 i가 증가했으면 다음엔 j가 감소
    • 이전에 j가 감소했으면 다음엔 i가 감소
    • 이전에 i가 감소했으면 다음엔 j가 증가
// n = 2 -> j++ 1회, i++ 1회, j-- 1회 
// n = 3 -> j++ 2회, i++ 2회, j-- 2회, i-- 1회, j++ 1회
// n = 4 -> j++ 3회, i++ 3회, j-- 3회, i-- 2회, j++ 2회, i++ 1회, j-- 1회,
// n = 5 -> j++ 4회, i++ 4회, j-- 4회, i-- 3회, j++ 3회, i++ 2회, j-- 2회, i-- 1회, j++ 1회 

였는데..
직접 코드로 작성하다보니 시간이 너무 오래 걸리고 복잡해져서 다른 사람의 솔루션을 학습하기로 했다.

solution

function solution(n) {
    const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
    const answer = Array.from(Array(n), () => Array(n).fill(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, 값이 0인 이차원배열 answer를 선언한다.
const answer = Array.from(Array(n), () => Array(n).fill(0))
  1. num이 n의 제곱수가 될때까지 배열에 num값을 할당하고 조건을 반복한다
while(num <= n**2) {
	answer[x][y] = num; // 값 할당
  	// 조건
}
  1. 앞서 선언해두었던 방향 이동값move(우,하,좌,상)을 현재 위치값 x,y에 더해서 다음 위치값nextY, nextY을 구하고
const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
	let nextX = x + move[dir][0];
    let nextY = y + move[dir][1];
  1. 다음 위치값nextY, nextY이 제한 길이를 오버하거나 다음 값answer[nextY,][nextY]이 0이 아니면 나머지 연산으로 다음 방향을 선택하는 것!
		dir = (dir + 1) % 4;
		nextX = x + move[dir][0];
    	nextY = y + move[dir][1];

나머지 연산으로 좌표의 일정한 증감 순서를 반복하고 방향을 조정하는 방식이 특이했고 배울만 하다.

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글