inblog logo
|
👨🏻‍💻DriedPollack's Blog
    💡Coding Test☕Java

    [programmers] 정수를 나선형으로 배치하기 - Java

    양의 정수 'n'을 매개변수로 받아 'n' × 'n' 배열에 1부터 'n'²까지의 정수를 시계방향 나선형으로 배치하는 함수를 작성하는 문제입니다. 이를 해결하기 위해, 배열을 'n'의 제곱만큼의 크기로 선언하고, while문을 통해 값을 1씩 증가시키며 반복합니다. 동서남북 방향을 설정하고, 각 방향에 맞게 다음에 갈 좌표를 설정합니다.
    Jan 23, 2024
    [programmers] 정수를 나선형으로 배치하기 - Java

    문제 설명

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

    제한사항

    • 1 ≤ n ≤ 30

    입출력 예

    n
    result
    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]]

    입출력 예 설명

    입출력 예 #1
    • 예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.
      • 행 \ 열
        0
        1
        2
        3
        0
        1
        2
        3
        4
        1
        12
        13
        14
        5
        2
        11
        16
        15
        6
        3
        10
        9
        8
        7
        따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.
    입출력 예 #2
    • 예제 2번의 n의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.
      • 행 \ 열
        0
        1
        2
        3
        4
        0
        1
        2
        3
        4
        5
        1
        16
        17
        18
        19
        6
        2
        15
        24
        25
        20
        7
        3
        14
        23
        22
        21
        8
        4
        13
        12
        11
        10
        9
        따라서 [[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]]를 return 합니다.

    solution.java

    class Solution { public int[][] solution(int n) { int[][] answer = new int[n][n]; int value = 1; // 채워야 할 정수 값 int row = 0; // 현재 행 위치 int col = 0; // 현재 열 위치 int direction = 0; // 이동 방향 (0: 오른쪽, 1: 아래, 2: 왼쪽, 3: 위) while (value <= n * n) { // 모든 정수 값을 배열에 채우면 종료 answer[row][col] = value++; // 현재 위치에 값을 채우고 다음 값으로 이동 // 다음 이동할 위치 계산 if (direction == 0) { // 오른쪽 방향으로 이동 if (col == n - 1 || answer[row][col + 1] != 0) { // 오른쪽 값이 채워져 있다면 direction = 1; row++; } else { col++; } } else if (direction == 1) { // 아래쪽 방향으로 이동 if (row == n - 1 || answer[row + 1][col] != 0) { // 아래쪽 값이 채워져 있다면 direction = 2; col--; } else { row++; } } else if (direction == 2) { // 왼쪽 방향으로 이동 if (col == 0 || answer[row][col - 1] != 0) { // 왼쪽 값이 채워져 있다면 direction = 3; row--; } else { col--; } } else if (direction == 3) { // 위쪽 방향으로 이동 if (row == 0 || answer[row - 1][col] != 0) { // 위쪽 값이 채워져 있다면 direction = 0; col++; } else { row--; } } } return answer; } }
     

    핵심 키워드

    • 배열을 n의 제곱만큼의 크기로 선언한다.
    • while문을 통해 value가 해당 값이 될 때까지 1씩 증가시키며 반복한다.
    • 0, 1, 2, 3을 각각 동서남북에 매칭해 방향을 설정하고, 각 방향에 맞게 다음에 갈 좌표를 설정한다.
     

    결론!

    처음 문제를 보고 나서 이해가 오랫동안 안되었고, 다음날까지 고민한 결과 인덱스의 증가마다 값의 규칙성을 찾기보다는, 이동한 자리에 해당하는 값을 1씩 증가시켜 대입하는 방식으로 문제를 해결할 수 있었다.
     
    Share article

    👨🏻‍💻DriedPollack's Blog

    RSS·Powered by Inblog