나선형 행렬(Spiral Matrix) 따라하기
// A spiral matrix is a square matrix where elements are filled in a spiral order,
// typically starting from the top-left corner and proceeding clockwise.
개요
나선형 행렬(Spiral Matrix) 은 2차원 배열에 값을 일정한 방향으로 회전하며 채우는 알고리즘 패턴입니다. 한국 교육에서는 흔히 달팽이 배열(Snail Array) 이라고도 부르며, 정보처리기사, 프로그래밍 입문자, 코딩 테스트에서 자주 등장합니다.
이 문서에서는 Spiral Matrix를 생성하는 방법을 단계별로 설명하고, 구현 및 실행 결과를 함께 확인해 봅니다.
용어 정리: 달팽이 배열 vs Spiral Matrix
용어 | 설명 |
---|---|
달팽이 배열 (Snail Array) | 한국 교육 과정이나 시험에서 사용되는 비공식 명칭 |
Spiral Matrix | 전 세계적으로 통용되는 정식 알고리즘 명칭 |
나선형 행렬 | Spiral Matrix의 수학적 번역 표현, 이산 수학 및 행렬 이론에서 사용됨 |
문제 예시
N × N 크기의 정사각형 배열을 1부터 N²까지 시계방향으로 나선형으로 채우시오.
예: N = 4
일 때 결과는 다음과 같습니다.
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
알고리즘 개요
Spiral Matrix 알고리즘은 다음 네 방향을 순서대로 반복하면서 배열을 채웁니다.
- → 오른쪽
- ↓ 아래쪽
- ← 왼쪽
- ↑ 위쪽
이때 배열의 가장자리에서 시작하여 안쪽으로 회전하며 값을 채우고, 매 반복마다 경계값 (top
, bottom
, left
, right
)을 조정합니다.
구현 단계
1. 변수 선언 및 초기화
N
: 배열의 크기arr[N][N]
: 값을 저장할 2차원 배열num
: 현재 채울 숫자 (1부터 시작)top
,bottom
,left
,right
: 경계값
2. 방향 순서대로 배열 채우기
- 오른쪽(→):
arr[top][left ~ right]
채운 후top++
- 아래쪽(↓):
arr[top ~ bottom][right]
채운 후right--
- 왼쪽(←):
arr[bottom][right ~ left]
채운 후bottom--
- 위쪽(↑):
arr[bottom ~ top][left]
채운 후left++
이 과정을 top <= bottom && left <= right
조건이 유지되는 동안 반복합니다.
물론입니다. 아래는 Spiral Matrix 결과:
출력 라인을 제거한 버전이며,
DocFX 탭 형식은 그대로 유지하면서 C, C#, Java, Python 코드에 동일한 주석도 유지했습니다.
전체 코드 예제
spiral_matrix.c
#include <stdio.h>
#define N 5 // 배열 크기를 컴파일 타임 상수로 정의
int main(void)
{
// 나선형으로 값을 채울 2차원 배열
int arr[N][N];
// 현재 채워야 할 숫자
int num = 1;
// 위쪽 경계
int top = 0;
// 아래쪽 경계
int bottom = N - 1;
// 왼쪽 경계
int left = 0;
// 오른쪽 경계
int right = N - 1;
// 나선형으로 배열 채우기
while (top <= bottom && left <= right) // 나선형으로 덮지 않은 영역이 남아 있는 동안 반복
{
// → 오른쪽으로 채우기
for (int i = left; i <= right; i++)
{
arr[top][i] = num++;
}
top++;
// ↓ 아래쪽으로 채우기
for (int i = top; i <= bottom; i++)
{
arr[i][right] = num++;
}
right--;
// ← 왼쪽으로 채우기
for (int i = right; i >= left; i--)
{
arr[bottom][i] = num++;
}
bottom--;
// ↑ 위쪽으로 채우기
for (int i = bottom; i >= top; i--)
{
arr[i][left] = num++;
}
left++;
}
// 결과 출력
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%3d", arr[i][j]);
}
printf("\n");
}
return 0;
}
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
알고리즘 특징 및 정형성
이 알고리즘은 다음과 같은 정형화된 패턴을 따릅니다:
특징 |
---|
방향 순회: 오른쪽 → 아래 → 왼쪽 → 위 반복 |
경계값(top , bottom , left , right ) 조절 |
while 루프 내에서 각 방향을 순차적으로 처리 |
1부터 N²까지의 값을 순차적으로 채움 |
이 구조는 반시계방향 배열, 중앙에서 시작하는 배열, 비정방형 배열 등으로도 손쉽게 확장이 가능합니다.
활용 사례
분야 | 설명 |
---|---|
정보처리기사 | 반복문과 2차원 배열 제어 문제로 자주 출제됨 |
코딩 테스트 | 나선형 순회 또는 특수 패턴 출력 문제 (예: LeetCode, 프로그래머스 등) |
프로그래밍 학습용 예제 | 배열 인덱스 제어, 패턴 출력, 조건문·반복문 실습용으로 효과적 |
요약
- 나선형 행렬(Spiral Matrix) 은 시계 방향으로 값을 채우는 배열 알고리즘입니다.
- 경계값 조절을 통해 반복적으로 순회하면서 배열을 채우는 구조로, 자료구조 + 시뮬레이션 알고리즘의 핵심 패턴을 학습할 수 있습니다.
- 정보처리기사, 코딩 테스트, 대학 수업 등 다양한 교육 및 실무 상황에서 자주 응용되므로 반드시 익혀두는 것이 좋습니다.
추천 자료: ASP.NET Core 인증 및 권한 부여
추천 자료: .NET Blazor에 대해 알아보시겠어요? .NET Blazor 알아보기를 확인해보세요!