728x90
🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 개요
n × n 크기의 배열에 1부터 n²까지의 숫자를 시계 방향의 나선형으로 채우는 문제이다.
배열의 시작 위치는 (0, 0)이며, 오른쪽으로 이동하다가 더 이상 진행할 수 없으면 아래, 왼쪽, 위 순서로 방향을 변경하며 모든 칸을 채운다.
📌 접근 방법
현재 위치와 방향을 관리하면서 1부터 n²까지 순서대로 배열에 저장한다.
다음 이동할 좌표를 미리 계산한 뒤, 배열 범위를 벗어나거나 이미 방문한 칸이라면 방향을 시계방향으로 변경한다.
방향이 변경되면 새로운 방향으로 다음 좌표를 다시 계산한 후 이동을 반복한다.
📌 핵심 아이디어
1. 방향 배열 사용
오른쪽, 아래, 왼쪽, 위 방향을 배열로 관리한다.
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
각 방향은 다음과 같다.
| dir | 방향 |
| 0 | → |
| 1 | ↓ |
| 2 | ← |
| 3 | ↑ |
2. 다음 좌표 계산
현재 방향을 이용해 다음 이동할 좌표를 계산한다.
int nx = x + dx[dir];
int ny = y + dy[dir];
현재 위치는 그대로 유지하고, 이동 가능한지 먼저 확인하기 위해 다음 좌표를 미리 계산한다.
3. 방향 변경
다음 위치가 범위를 벗어나거나 이미 방문한 칸이라면 방향을 변경한다.
if (nx >= n || ny >= n || nx < 0 || ny < 0 || answer[nx][ny] != 0) {
dir = (dir + 1) % 4;
nx = x + dx[dir];
ny = y + dy[dir];
}
(dir + 1) % 4를 사용하면
오른쪽 → 아래 → 왼쪽 → 위 → 오른쪽
순으로 방향이 반복된다.
4. 다음 위치로 이동
방향이 결정되면 다음 좌표로 이동한다.
x = nx;
y = ny;
이 과정을 n²개의 숫자를 모두 채울 때까지 반복하면 된다.
📌 전체 코드
import java.util.Arrays;
public class No41 {
public static void main(String[] args) {
int n = 4;
int num = 1;
int[][] answer = new int[n][n];
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
int x = 0;
int y = 0;
int dir = 0;
while (num <= n * n) {
answer[x][y] = num++;
int nx = x + dx[dir];
int ny = y + dy[dir];
if (nx >= n || ny >= n || nx < 0 || ny < 0 || answer[nx][ny] != 0) {
dir = (dir + 1) % 4;
nx = x + dx[dir];
ny = y + dy[dir];
}
x = nx;
y = ny;
}
System.out.println(Arrays.deepToString(answer));
}
}
📄 정리
- 방향 배열(dx, dy)을 사용하면 이동 로직을 간결하게 구현할 수 있다.
- 다음 좌표를 먼저 계산한 뒤 이동 가능 여부를 판단하는 것이 핵심이다.
- (dir + 1) % 4를 이용하면 시계방향 회전을 쉽게 구현할 수 있다.
- 구현 및 시뮬레이션 문제에서 자주 사용하는 패턴이므로 익혀두면 다양한 문제에 활용할 수 있다.
728x90
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 햄버거 만들기 JAVA 풀이 (스택, 구현) (0) | 2026.06.27 |
|---|---|
| 프로그래머스 대충 만든 자판 JAVA 풀이 (HashMap, 구현) (0) | 2026.06.26 |
| 프로그래머스 신호등 정전 JAVA 풀이 (시뮬레이션, 최소공배수) (0) | 2026.06.25 |
| 프로그래머스 창고 정리 JAVA 풀이 (0) | 2026.06.24 |
| 프로그래머스 숫자의 표현 JAVA 풀이 (투 포인터, 슬라이딩 윈도우) (0) | 2026.06.23 |