본문 바로가기

알고리즘

달팽이 배열

(1)-> (1)-> (1)-> (1)-> (1)->
(~2)↑ (1)-> (1)-> (1)-> (2)↓
(~2)↑ (~2)↑ (1)-> (2)↓ (2)↓
(~2)↑ (~1)<- (~1)<- (~1)<- (2)↓
(~1)<- (~1)<- (~1)<- (~1)<- (~1)<-


위 표는 5*5 행렬에서 배열을 순환하면서 어떻게 초기화 할지에 대한 내용이다.

(1) 은 오른쪽으로만, (~1) 은 왼쪽으로만

(2) 는 아래로만, (~2) 는 위로만 움직이는 반복문을 의미한다.

여기서 반복의 횟수가 중요한데, 

(1) (~1) 은 5, 3, 1 

(2) (~2) 는 3, 1

이다.

 

void snail(int ** board, int n)
{
    int n2 = n * n;
    int len = n;
    int x = -1, y = -1, cnt = 0;
    
    for (int val = 1; val <= n2; len -= 2)
    {
        for (x += 1, y += 1, cnt = 0; cnt < len; cnt++)
            board[y][x++] = val++;
        
        for (x -= 1, y += 1, cnt = 0; cnt < len - 2; cnt++)
            board[y++][x] = val++;
        
        for (cnt = 0; cnt < len; cnt++)
            board[y][x--] = val++;
            
        for (x += 1, y -= 1, cnt = 0; cnt < len - 2; cnt++)
            board[y--][x] = val++;
     }
}

n2 는 n의 제곱승을 말하며, 이는 배열의 중앙의 놓이는 값이다.

첫번째 for문은 오른쪽으로만 이동하는 반복문이다.

두번째 for문은 아래로만 이동하는 반복문이다. 첫번째 for문이 종료되었을 때, x값은 배열의 범위를 벗어난다. 

이를 보정하기 위해 x -= 1을 하는 것이다. 또한 y += 1 을 하여 밑으로 내려보낸다.

세번째 for문은 왼쪽으로만 이동하는 반복문이다. 두번째 반복문이 종료되었을때는 배열의 범위를 벗어나지 않기 
때문에 y값을 그대로 사용하면된다. 

마지막 for문은 위로만 이동하는 반복문이다. 



'알고리즘' 카테고리의 다른 글

Graph, DFS and BFS  (0) 2021.10.27
병합정렬  (0) 2021.10.27
삽입정렬  (0) 2021.10.27
소인수분해  (0) 2021.10.27
최대공약수, 최소공배수  (0) 2021.10.27