문제 설명

양의 정수 n이 매개변수로 주어집니다.

n x n 배열에 1부터 n^2까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을

return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 <= n <= 30

입출력 예

#1

  • n = 4
  • result = [[1, 2, 3, 4], [12,  13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]

#2

  • n = 5
  • result [[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]]


정답 코드

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        
        int[] dx = {0, 1, 0, -1}; // 오른쪽, 아래, 왼쪽, 위
        int[] dy = {1, 0, -1, 0}; // 오른쪽, 아래, 왼쪽, 위
        
        int x = 0, y = 0;
        int direction = 0;

        for (int i = 1; i <= n * n; i++) {
            answer[x][y] = i; // 현재 위치에 숫자 배치
            int nx = x + dx[direction];
            int ny = y + dy[direction];
            
            // 배열을 벗어나거나 이미 숫자가 배치된 위치라면 방향을 변경
            if (nx < 0 || ny < 0 || nx >= n || ny >= n || answer[nx][ny] != 0) {
                direction = (direction + 1) % 4;
                nx = x + dx[direction];
                ny = y + dy[direction];
            }
            
            x = nx;
            y = ny;
        }
        
        return answer;
    }
}

 

풀이

1. 배열 n*n 크기의 이차원 배열을 생성

2. 시계방향으로 숫자를 배치하기 위해 direction 배열을 선언한다.

이 배열은 오른쪽, 아래, 왼쪽, 위 순서로 숫자를 배치하기 위한 방향을 지정한다.

3. 현재 위치와 방향을 나타내는 변수 x, y, direction을 초기화한다.

x, y는 시작 지점인 [0][0]을 의미하며, direction은 초기에 오른쪽으로 움직이기 위해 0으로 설정함

4. 1부터 n*n까지의 정수를 시계방향으로 배치한다. 

각 위치에 숫자를 배치할 때마다 다음 방향으로 이동하는데,

배열을 벗어나거나 이미 숫자가 배치된 위치에 도달하면 방향을 변경한다.

5. 숫자가 모두 배치된 이차원 배열 answer를 반환한다.

 

'코딩테스트' 카테고리의 다른 글

백준 10807 개수 세기  (0) 2023.03.22
미완/백준 2830 행성 X3  (0) 2023.03.22
백준 9012 괄호  (0) 2023.03.22
숫자 문자열과 영단어  (0) 2023.03.22
코테 입문 - (수학)짝수는 싫어요  (0) 2023.03.21