2차원 배열(매트릭스)을 Z자 형태로 출력하는 것은 코딩 테스트와 알고리즘 학습에서 자주 만나는 대표적인 배열 순회 문제입니다. 여기서 Z자 형태란 매트릭스를 영문 대문자 'Z'를 그리듯이 순회하는 방식을 의미하며, 구체적인 방문 순서는 다음과 같습니다.
- 첫 번째 행 — 왼쪽에서 오른쪽으로 모든 요소를 출력
- 역대각선 — 오른쪽 위에서 왼쪽 아래로 이어지는 대각선 요소를 출력
- 마지막 행 — 왼쪽에서 오른쪽으로 모든 요소를 출력
아래는 이 로직을 자바로 구현한 예제 코드입니다.
예제 코드
import java.lang.*;
import java.io.*;
public class Demo {
public static void z_shape(int my_arr[][], int n) {
int i = 0, j, k;
// ① 첫 번째 행 출력 (마지막 열 제외)
for (j = 0; j < n - 1; j++) {
System.out.print(my_arr[i][j] + " ");
}
// ② 역대각선 요소 출력
k = 1;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n; j++) {
if (j == n - k) {
System.out.print(my_arr[i][j] + " ");
break;
}
}
k++;
}
// ③ 마지막 행 전체 출력
i = n - 1;
for (j = 0; j < n; j++)
System.out.print(my_arr[i][j] + " ");
System.out.print("\n");
}
public static void main(String[] args) {
int my_arr[][] = { { 34, 67, 89, 0 }, { 0, 1, 0, 1 },
{ 56, 99, 102, 21 }, { 78, 61, 40, 99 } };
System.out.println("The matrix is ");
z_shape(my_arr, 4);
}
}
실행 결과
The matrix is 34 67 89 0 0 99 78 61 40 99
코드 동작 원리
Demo 클래스 안에는 z_shape라는 정적 메서드가 정의되어 있으며, 이 메서드는 매개변수로 받은 2차원 배열을 'Z' 모양의 경로를 따라 순회합니다. 각 단계의 동작은 다음과 같습니다.
1단계: 첫 번째 행 출력
행 인덱스 i를 0으로 고정한 채 열 인덱스 j를 0부터 n-2까지 반복하며 첫 번째 행의 요소를 차례로 출력합니다. 첫 번째 행의 마지막 요소는 곧바로 이어지는 대각선 출력 과정에서 처리되므로 여기서는 제외됩니다.
2단계: 역대각선 출력
변수 k를 1로 초기화한 후, 각 행마다 열 값이 n - k와 일치하는 위치의 요소만 출력하고 break 문으로 내부 반복문을 빠져나옵니다. 행이 한 칸 내려갈 때마다 k가 1씩 증가하기 때문에 출력 위치가 오른쪽에서 왼쪽으로 한 칸씩 이동하며, 그 결과 오른쪽 위에서 왼쪽 아래로 이어지는 Z자의 대각선이 완성됩니다.
3단계: 마지막 행 출력
행 인덱스 i를 n - 1로 설정한 뒤 모든 열을 순회하며 마지막 행 전체를 출력합니다. 이로써 Z자의 아래쪽 가로줄까지 모두 그려지게 됩니다.
main 메서드에서는 4×4 크기의 2차원 배열 my_arr를 선언하고, 이 배열과 크기 4를 인수로 넘겨 z_shape 메서드를 호출합니다. 실행이 완료되면 콘솔에 Z자 순서대로 읽어 들인 요소들이 한 줄로 출력됩니다.