이 문제에서는 2차원 행렬이 주어지며, 우리가 해야 할 일은 이 행렬의 요소들을 지그재그(ZigZag) 형태로 출력하는 것입니다.
예시를 통해 문제를 살펴보겠습니다.
입력:
12 99 43
10 82 50
15 75 5
출력: 12 99 43 50 82 10 15 75 5
문제 해결 접근 방법
이 문제를 해결하는 핵심 아이디어는 다음과 같습니다.
- 짝수 번째 행(0, 2, 4...): 왼쪽에서 오른쪽(LtoR) 방향으로 요소를 출력합니다.
- 홀수 번째 행(1, 3, 5...): 오른쪽에서 왼쪽(RtoL) 방향으로 요소를 출력합니다.
즉, 행 인덱스가 짝수인지 홀수인지에 따라 순회 방향을 전환하면서 전체 행렬을 한 줄로 이어서 출력하면 지그재그 패턴이 완성됩니다.
예제 코드
#include <iostream>
using namespace std;
void printZigZagPattern(int row, int col, int a[][5]) {
int evenRow = 0; // 짝수 행 (왼쪽 → 오른쪽)
int oddRow = 1; // 홀수 행 (오른쪽 → 왼쪽)
while (evenRow < row) {
// 짝수 행: 왼쪽에서 오른쪽으로 출력
for (int i = 0; i < col; i++) {
cout << a[evenRow][i] << " ";
}
evenRow += 2;
// 홀수 행: 오른쪽에서 왼쪽으로 출력
if (oddRow < row) {
for (int i = col - 1; i >= 0; i--)
cout << a[oddRow][i] << " ";
}
oddRow += 2;
}
}
int main() {
int r = 3, c = 3;
int mat[][5] = {
{12, 99, 43},
{10, 82, 50},
{15, 75, 5}
};
cout << "지그재그 형태로 출력된 행렬의 요소 :\n";
printZigZagPattern(r, c, mat);
return 0;
}
실행 결과
위 코드를 실행하면 행렬의 요소들이 다음과 같이 지그재그 형태로 출력됩니다.
12 99 43 50 82 10 15 75 5
동작 원리 정리
evenRow는 0부터 시작하여 2씩 증가하며, 각 짝수 행을 왼쪽에서 오른쪽으로 순회합니다.oddRow는 1부터 시작하여 2씩 증가하며, 해당 행이 존재하는 경우(oddRow < row) 오른쪽에서 왼쪽으로 순회합니다.- 두 반복문이 교대로 실행되면서 자연스럽게 방향이 번갈아 바뀌는 지그재그 출력이 만들어집니다.
이 알고리즘은 모든 행렬 요소를 정확히 한 번씩만 방문하므로 시간 복잡도는 O(row × col)이며, 추가적인 저장 공간 없이 제자리에서 출력할 수 있어 효율적입니다.