728x90
Java 2차원 배열 문제는 숫자를 외워 넣는 문제가 아니라 행과 열 중 어느 방향을 먼저 움직이는지를 설계하는 문제다. 세로 채우기, 지그재그 채우기, 왼쪽 90도 회전을 좌표 변화로 읽어 보자.
먼저 적을 것: 출력 좌표 [row][col]에 어떤 입력 좌표 또는 몇 번째 숫자가 들어가는가?

5×5 격자를 세로·지그재그로 채우고 왼쪽으로 90도 회전하는 좌표 변화
1. arr[row][col]에서 바깥 반복문을 결정한다
| 패턴 | 먼저 움직이는 축 | 핵심 좌표 |
|---|---|---|
| 가로 채우기 | 행 고정, 열 증가 | arr[row][col] |
| 세로 채우기 | 열 고정, 행 증가 | arr[row][col] |
| 회전 | 출력 좌표 기준 | 입력의 열·행 교환 |
배열 저장 순서와 화면 출력 순서는 다를 수 있다. 채우기 코드는 패턴을 만들고, 출력 코드는 항상 행을 위에서 아래로 읽는다고 나눠 생각하면 덜 헷갈린다.
2. 숫자를 열 방향으로 채우기
static int[][] fillByColumn(int n) {
int[][] board = new int[n][n];
int value = 1;
for (int col = 0; col < n; col++) {
for (int row = 0; row < n; row++) {
board[row][col] = value++;
}
}
return board;
}
원문 12는 arr[j][i]로 열을 먼저 고정했다. 변수명을 row, col로 바꾸면 왜 인덱스 순서가 뒤집혀 보였는지 분명해진다.
728x90
3. 짝수 행은 오른쪽, 홀수 행은 왼쪽
static int[][] fillSnake(int n) {
int[][] board = new int[n][n];
int value = 1;
for (int row = 0; row < n; row++) {
if (row % 2 == 0) {
for (int col = 0; col < n; col++) {
board[row][col] = value++;
}
} else {
for (int col = n - 1; col >= 0; col--) {
board[row][col] = value++;
}
}
}
return board;
}
원문 14의 핵심은 행의 홀짝이다. 숫자 value는 항상 증가하지만 열 인덱스의 진행 방향만 바뀐다.
4. 왼쪽으로 90도 회전하기
static int[][] rotateLeft(int[][] source) {
int rows = source.length;
int cols = source[0].length;
int[][] rotated = new int[cols][rows];
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
rotated[cols - 1 - col][row] = source[row][col];
}
}
return rotated;
}
정사각형만 가정하지 않고 행과 열이 다른 배열도 처리한다. 원본 [row][col]은 왼쪽 회전 후 [cols - 1 - col][row]로 이동한다.
5. 실수하기 쉬운 부분
모든 반복 조건에 arr.length를 쓴다
직사각형 배열의 열 길이는 arr[row].length다. 행과 열 크기를 따로 저장한다.
채우기와 출력을 한 반복문에서 해결한다
패턴이 복잡해지면 저장을 끝낸 뒤 별도 메서드로 출력하는 편이 좌표를 검증하기 쉽다.
회전 방향을 눈으로만 판단한다
왼쪽 위, 오른쪽 위 같은 모서리 하나가 어디로 이동해야 하는지 좌표를 대입해 확인한다.
핵심 요약
- 행과 열 중 어느 축을 먼저 움직일지 정한다.
- 지그재그는 숫자보다 열 진행 방향만 바꾼다.
- 왼쪽 회전 좌표는
[cols-1-col][row]다. - 직사각형 배열에서는 행·열 길이를 구분한다.
728x90
'자격증·공부 아카이브 > Java 기초' 카테고리의 다른 글
| Java 배열 집계와 랜덤: 최댓값·학점 빈도·중복 없는 로또 (0) | 2026.08.04 |
|---|---|
| Java 문자열 집계 문제: 알파벳 빈도·OX 점수·숫자 대시 개수 (0) | 2026.08.03 |
| Java 숫자 계산 예제: 거스름돈·반올림·구구단·세 자리 곱셈 (0) | 2026.08.02 |
| Java while문 실전: 목표 달성·덧셈 게임·종료 조건 (0) | 2026.08.02 |
| Java 반복문 누적 계산: 교대 합·수열·팩토리얼 풀이 (0) | 2026.08.01 |