문제 설명
양의 정수 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 |