n×n 크기의 2차원 배열이 주어졌을 때, 각 요소의 원래 위치를 변경하지 않고 배열의 요소를 스네이크(지그재그) 패턴으로 출력하는 프로그램을 만들어 보겠습니다.
스네이크 패턴이란 첫 번째 행은 왼쪽에서 오른쪽으로, 다음 행은 오른쪽에서 왼쪽으로 출력하는 방식으로, 마치 뱀이 기어가는 모양처럼 행마다 방향을 번갈아 가며 순회하는 것을 말합니다.
예제
입력: arr[]= 100 99 98 97 93 94 95 96 92 91 90 89 85 86 87 88 출력: 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85
동작 원리
프로그램은 행렬의 각 행을 순서대로 탐색하면서 해당 행이 짝수 번째인지 홀수 번째인지 확인합니다.
행 인덱스가 짝수이면 해당 행의 요소를 왼쪽에서 오른쪽으로 출력합니다.
행 인덱스가 홀수이면 해당 행의 요소를 오른쪽에서 왼쪽으로 출력합니다.
이렇게 하면 배열의 실제 데이터는 전혀 변경되지 않은 채 출력 순서만 스네이크 패턴으로 바뀌게 됩니다.
알고리즘
시작 1단계 -> 행과 열의 크기를 선언합니다 (예: 4x4) 2단계 -> 변수 i, j와 요소를 포함한 배열 arr[][]를 선언합니다 3단계 -> 반복문: i=0부터 i<M까지 i++ 만약 i%2==0 이라면 반복문: j=0부터 j<N까지 j++ arr[i][j] 출력 반복문 끝 그렇지 않다면 반복문: j=N-1부터 j>=0까지 j-- arr[i][j] 출력 반복문 끝 종료
C 언어 구현 예제
#include<stdio.h>
#define M 4
#define N 4
int main() {
int i,j;
int arr[M][N] = {
{ 100, 99, 98, 97 },
{ 93, 94, 95, 96 },
{ 92, 91, 90, 89 },
{ 85, 86, 87, 88 }
};
for (i = 0; i < M; i++) { // 행 순회
if (i % 2 == 0) {
for (j = 0; j < N; j++) // 열 순회 (왼쪽 → 오른쪽)
printf("%d ",arr[i][j]);
} else{
for (j = N - 1; j >= 0; j--) // 열 순회 (오른쪽 → 왼쪽)
printf("%d ",arr[i][j]);
}
}
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85
정리
이 방식의 핵심은 단순히 행 인덱스를 2로 나눈 나머지(i % 2)를 확인하는 것입니다. 짝수 행과 홀수 행의 열 순회 방향만 바꾸면 별도의 추가 배열이나 데이터 복사 없이도 스네이크 패턴 출력을 쉽게 구현할 수 있습니다. 시간 복잡도는 O(M×N)으로, 행렬의 모든 요소를 한 번씩만 방문하므로 매우 효율적입니다.