Post

[Programmers] #181832 - 정수를 나선형으로 배치하기 [Java][C++][Python]

[Programmers] #181832 - 정수를 나선형으로 배치하기 [Java][C++][Python]

문제 링크


1. 아이디어

n × n의 달팽이 배열을 만드는 문제로 방향 배열을 활용하면 해결할 수 있다. 시계방향으로 회전하도록 방향 배열을 정의한 후, 다음 칸으로의 이동은 방향 배열을 통해 진행하며 다음 칸이 배열 내부면서 방문하지 않은 칸이면 방문 후 이동하는 과정을 반복하면 된다.


2. 복잡도

접근시간공간
풀이$O(N^2)$$O(N^2)$

($N$ = 입력값 n)


3. 코드

풀이 [Java][C++][Python]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {

    static int[] dr = {-1, 0, 1, 0};
    static int[] dc = {0, 1, 0, -1};

    public int[][] solution(int n) {
        int[][] arr = new int[n][n];
        int r = 0, c = -1, d = 1, num = 1;

        while (num <= n * n) {
            int nr = r + dr[d];
            int nc = c + dc[d];
            if (nr < 0 || nr >= n || nc < 0 || nc >= n || arr[nr][nc] != 0) {
                d = (d + 1) % 4;
                nr = r + dr[d];
                nc = c + dc[d];
            }

            arr[nr][nc] = num++;
            r = nr;
            c = nc;
        }

        return arr;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <bits/stdc++.h>
using namespace std;

int dr[4] = {-1, 0, 1, 0};
int dc[4] = {0, 1, 0, -1};

vector<vector<int>> solution(int n) {
    vector<vector<int>> arr(n, vector<int>(n));
    int r = 0, c = -1, d = 1, num = 1;

    while (num <= n * n) {
        int nr = r + dr[d];
        int nc = c + dc[d];
        if (nr < 0 || nr >= n || nc < 0 || nc >= n || arr[nr][nc] != 0) {
            d = (d + 1) % 4;
            nr = r + dr[d];
            nc = c + dc[d];
        }

        arr[nr][nc] = num++;
        r = nr;
        c = nc;
    }

    return arr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(n):
    arr = [[0] * n for _ in range(n)]
    dr = (-1, 0, 1, 0)
    dc = (0, 1, 0, -1)
    r, c, d, num = 0, -1, 1, 1

    while num <= n * n:
        nr, nc = r + dr[d], c + dc[d]
        if not (0 <= nr < n and 0 <= nc < n) or arr[nr][nc] != 0:
            d = (d + 1) % 4
            nr, nc = r + dr[d], c + dc[d]

        arr[nr][nc] = num
        num += 1
        r, c = nr, nc

    return arr

This post is licensed under CC BY 4.0 by the author.