이 글에서는 주어진 문제 상황을 해결하기 위한 풀이 방법과 접근 과정을 자세히 알아보겠습니다.
문제 정의
문제 — n×n 크기의 정방행렬(스퀘어 행렬)이 주어졌을 때, 행렬의 모든 요소를 Z자(Z form) 형태로 화면에 출력해야 합니다.
Z자 형태란 행렬을 다음 순서대로 순회하는 것을 의미합니다.
- 첫 번째 행: 왼쪽에서 오른쪽 끝까지 순회합니다.
- 부대각선(반대 대각선): 오른쪽 위에서 왼쪽 아래로 대각선 방향으로 순회합니다.
- 마지막 행: 왼쪽에서 오른쪽 끝까지 순회합니다.
이 세 구간을 이어서 그리면 영문 대문자 'Z' 모양이 완성됩니다.
예제 코드
여기서는 입력 행렬을 코드에 직접 포함시켜 코드의 흐름을 보여드리겠습니다.
arr = [[1, 2, 6, 9], [1, 2, 3, 1], [7, 1, 3, 5], [1, 8, 7, 5]] n = len(arr[0]) i = 0 # 첫 번째 행 출력 (마지막 요소 제외) for j in range(0, n-1): print(arr[i][j], end=' ') k = 1 # 부대각선 요소 출력 for i in range(0, n): for j in range(n, 0, -1): if(j == n-k): print(arr[i][j], end=' ') break k += 1 # 마지막 행 출력 i = n-1 for j in range(0, n): print(arr[i][j], end=' ')
실행 결과
1 2 6 9 3 1 1 8 7 5
코드 동작 원리
모든 변수와 함수는 아래 그림과 같이 전역 범위(global scope)에 선언되어 있습니다.

코드가 동작하는 과정을 단계별로 살펴보면 다음과 같습니다.
- 첫 번째 루프: 인덱스
j를 0부터 n-2까지 반복하며 첫 행의 요소를 출력합니다. 첫 행의 마지막 요소는 부대각선 순회에서 다시 등장하므로 여기서는 제외합니다. - 두 번째 루프: 각 행마다 열 인덱스를 뒤에서부터 검사하여, 해당 행의 부대각선 위치(
j == n-k)에 있는 요소 하나만 골라 출력합니다. - 세 번째 루프: 마지막 행의 모든 요소를 처음부터 끝까지 출력합니다.
이 알고리즘은 행렬의 모든 요소를 일일이 확인하지 않고 출력에 필요한 요소만 방문하므로 시간 복잡도는 O(n)이며, 별도의 추가 메모리 없이 O(1)의 공간 복잡도로 해결할 수 있습니다.
결론
이 글에서는 파이썬을 이용해 행렬을 Z자 형태로 출력하는 방법을 알아보았습니다. 전체 행렬을 탐색하는 대신 첫 행, 부대각선, 마지막 행의 세 구간으로 나누어 순회하면 누구나 쉽게 Z 형태 출력 로직을 구현할 수 있습니다.