Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 2차원 행렬을 지그재그(ZigZag) 형태로 출력하기

이 문제에서는 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

동작 원리 정리

  1. evenRow는 0부터 시작하여 2씩 증가하며, 각 짝수 행을 왼쪽에서 오른쪽으로 순회합니다.
  2. oddRow는 1부터 시작하여 2씩 증가하며, 해당 행이 존재하는 경우(oddRow < row) 오른쪽에서 왼쪽으로 순회합니다.
  3. 두 반복문이 교대로 실행되면서 자연스럽게 방향이 번갈아 바뀌는 지그재그 출력이 만들어집니다.

이 알고리즘은 모든 행렬 요소를 정확히 한 번씩만 방문하므로 시간 복잡도는 O(row × col)이며, 추가적인 저장 공간 없이 제자리에서 출력할 수 있어 효율적입니다.