728x90
달팽이 알고리즘(Snail Sort 또는 Spiral Order Traversal)은 행렬(matrix)을 처음부터 끝까지 달팽이의 움직임과 유사하게 순회하는 알고리즘입니다. 이 알고리즘은 행렬의 각 원소를 한 번씩만 방문하면서 순회합니다.
알고리즘의 움직임은 아래와 같습니다:
첫 번째 행을 왼쪽에서 오른쪽으로 순회합니다.
마지막 열을 위에서 아래로 순회합니다.
마지막 행을 오른쪽에서 왼쪽으로 순회합니다.
첫 번째 열을 아래에서 위로 순회합니다.
이 과정을 반복하면서 행렬의 중앙까지 진행하게 됩니다. 만약 행과 열의 크기가 홀수인 경우에는 마지막 단계에서 중앙에 위치한 원소가 중복해서 방문되게 됩니다.
다음은 3x3 행렬에 대한 달팽이 알고리즘의 동작 예시입니다:
1 2 3
8 9 4
7 6 5
이 알고리즘은 주로 2차원 배열을 나선형으로 순회해야 할 때 사용됩니다. 구현은 프로그래밍 언어에 따라 다르지만, 주로 중첩된 반복문을 사용하여 각 단계를 처리합니다.
int[,] board;
void SetBoard(int size)
{
board = new int[size, size];
int dir = 0;
int y = 0;
int x = 0;
int[] dy = { 0, 1, 0, -1 };
int[] dx = { 1, 0, -1, 0 };
int num = 1;
while (true)
{
board[y, x] = num;
int nextY = y + dy[dir];
int nextX = x + dx[dir];
if (num == size * size)
break;
if (CanGo(size, nextY, nextX))
{
y = nextY;
x = nextX;
num++;
}
else
{
dir = (dir + 1) % 4;
}
}
}
void PrintBoard(int size)
{
for (int y = 0; y < size; y++)
{
for (int x = 0; x < size; x++)
{
Console.Write(board[y, x].ToString("00") + " ");
}
Console.WriteLine();
}
}
bool CanGo(int size, int y, int x)
{
if (y < 0 || y >= size)
return false;
if (x < 0 || x >= size)
return false;
if (board[y, x] != 0)
return false;
return true;
}
728x90
'코딩공부 > 자료구조' 카테고리의 다른 글
[자료구조] 순열(Permutation)개념 구현 C# (0) | 2023.07.19 |
---|---|
[자료구조] 힙트리와 이진트리 개념 및 우선순위큐 구현 C# (0) | 2023.06.27 |
[자료구조] 트리개념 및 구현 C# (0) | 2023.06.27 |
[자료구조] 그래프 순회와 다익스트라 최단 경로 알고리즘 C# (0) | 2023.06.26 |
[자료구조] 동적배열, 연결리스트 구현 및 시간복잡도 (0) | 2023.06.23 |