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

C++에서 한 점부터 시작해 나선형으로 행렬 출력하기

문제 개요

이 문제에서는 하나의 2차원 행렬과 한 점 P(c, r)가 주어집니다. 목표는 주어진 점 P에서 출발하여 행렬의 모든 요소를 반시계 방향으로 나선형(spiral)으로 탐색하며 출력하는 것입니다.

예제

예시를 통해 문제를 더 쉽게 이해해 보겠습니다.

입력:
matrix[][] = {{1, 4, 7},
              {2, 5, 8},
              {3, 6, 9}}
시작점 P = (0행, 2열)

출력:
7 8 5 4 9 6 3 2 1

위 예제에서 시작점은 값 7이 있는 위치입니다. 이 지점에서 출발해 왼쪽 → 아래 → 왼쪽 → 위쪽 순서로 방향을 바꿔 가며 반시계 방향 나선을 그리면, 행렬의 모든 요소가 순서대로 출력됩니다.

접근 방법

이 문제는 4개의 루프를 사용해 해결할 수 있습니다. 각 루프는 자신이 담당하는 방향(왼쪽, 아래, 오른쪽, 위)의 요소들을 차례로 출력하며, 시작점 P에서 출력을 시작한 뒤 경계값(low/high row·column)을 조정해 가면서 나선 형태로 바깥에서 안쪽으로 확장해 나갑니다.

핵심 동작 방식은 다음과 같습니다.

  • low_row / high_row, low_column / high_column: 현재 나선이 탐색 중인 행렬의 경계를 나타냅니다.
  • 첫 번째 루프는 왼쪽 방향, 두 번째는 아래쪽, 세 번째는 오른쪽, 네 번째는 위쪽 요소를 출력합니다.
  • 각 방향의 출력이 끝날 때마다 해당 경계값을 갱신해 나선의 범위를 넓힙니다.
  • 행렬의 모든 요소를 출력할 때까지 while 루프를 반복하며, 배열 범위를 벗어나지 않도록 조건 검사를 수행합니다.

구현 예제

다음은 위 해결 방법을 C++로 구현한 프로그램입니다.

#include <iostream>
using namespace std;
const int MAX = 100;

void printSpiralMatrix(int mat[][MAX], int r, int c) {
    int i, a = 0, b = 2;
    int low_row = (0 > a) ? 0 : a;
    int low_column = (0 > b) ? 0 : b - 1;
    int high_row = ((a + 1) >= r) ? r - 1 : a + 1;
    int high_column = ((b + 1) >= c) ? c - 1 : b + 1;
    while ((low_row > 0 - r && low_column > 0 - c)) {
        for (i = low_column + 1; i <= high_column && i < c && low_row >= 0; ++i)
            cout<<mat[low_row][i]<<" ";
        low_row -= 1;
        for (i = low_row + 2; i <= high_row && i < r && high_column < c; ++i)
            cout<<mat[i][high_column]<<" ";
        high_column += 1;
        for (i = high_column - 2; i >= low_column && i >= 0 && high_row < r; --i)
            cout << mat[high_row][i]<<" ";
        high_row += 1;
        for (i = high_row - 2; i > low_row && i >= 0 && low_column >= 0; --i)
            cout<<mat[i][low_column]<<" ";
        low_column -= 1;
    }
    cout << endl;
}

int main() {
    int mat[][MAX] = {
        { 1, 4, 7 },
        { 2, 5, 8 },
        { 3, 6, 9 }
    };
    int r = 3, c = 3;
    cout<<"Spiral traversal of matrix starting from point "<<r<<", "<<c<<" is :\n";
    printSpiralMatrix(mat, r, c);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Spiral traversal of matrix starting from point 3, 3 is :
7 8 5 4 9 6 3 2 1

출력 결과를 보면 시작점(0행, 2열)의 값 7에서 출발해 반시계 방향으로 나선을 그리며, 행렬의 모든 요소가 정확히 한 번씩 출력된 것을 확인할 수 있습니다. 이처럼 경계 변수를 활용한 4방향 루프 구조만 이해하면, 임의의 시작점에서 나선형 순회를 손쉽게 구현할 수 있습니다.