이번 글에서는 행렬의 요소들을 Z자 형태로 출력하는 C++ 프로그램을 작성하는 방법을 알아보겠습니다. Z 형태 출력은 다음과 같은 순서로 진행됩니다.
- 첫 번째 행: 행렬의 가장 윗줄에 있는 모든 요소를 출력합니다.
- 반대각선: 오른쪽 위에서 왼쪽 아래로 내려가는 대각선상의 요소들을 출력합니다. 단, 양 끝 모서리는 이미 첫 번째 행과 마지막 행에 포함되어 있으므로 건너뜁니다.
- 마지막 행: 행렬의 가장 아랫줄에 있는 나머지 요소들을 출력합니다.
예를 들어 아래와 같은 4×4 행렬이 주어졌다고 가정해 보겠습니다.
5 8 7 1 2 3 6 4 1 7 8 9 4 8 1 5
위 행렬을 Z 형태로 출력하면 결과는 다음과 같습니다.
5, 8, 7, 1, 6, 7, 4, 8, 1, 5
알고리즘
printMatrixZ(mat)
시작
첫 번째 행을 출력한다
i := 1, j := n-2
i < n 이고 j >= 0 인 동안 반복:
mat[i, j] 출력
i := i + 1, j := j - 1
반복 종료
마지막 행을 출력한다
종료
C++ 코드 예제
#include<iostream>
#define MAX 4
using namespace std;
// 행렬을 Z 형태로 출력하는 함수
void printMatrixZ(int mat[][MAX], int n){
// 1. 첫 번째 행 출력
for(int i = 0; i<n; i++){
cout << mat[0][i] << " ";
}
// 2. 반대각선 요소 출력 (오른쪽 위 → 왼쪽 아래)
int i = 1, j = n-2;
while(i < n && j >= 0){
cout << mat[i][j] << " ";
i++;
j--;
}
// 3. 마지막 행 출력
for(int i = 1; i<n; i++){
cout << mat[n-1][i] << " ";
}
}
int main() {
int matrix[][MAX] = {{5, 8, 7, 1},
{2, 3, 6, 4},
{1, 7, 8, 9},
{4, 8, 1, 5}
};
printMatrixZ(matrix, 4);
}
출력 결과
5 8 7 1 6 7 4 8 1 5
동작 원리 및 복잡도 분석
코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.
- 첫 번째 for 루프가 0행의 모든 요소를 출력합니다. (5 8 7 1)
- while 루프는 인덱스 i를 증가시키고 j를 감소시키며 반대각선 방향의 요소들을 출력합니다. 이때 마지막 행의 첫 번째 열 요소(mat[n-1][0])까지 함께 처리됩니다. (6 7 4)
- 마지막 for 루프가 마지막 행의 나머지 요소들을 출력합니다. (8 1 5)
이 알고리즘은 행렬 전체가 아닌 테두리와 대각선 요소만 방문하므로 시간 복잡도는 O(n)입니다. 또한 별도의 추가 메모리를 사용하지 않으므로 공간 복잡도는 O(1)로 매우 효율적입니다.