만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/programmers&bj

[C++][알고리즘] 달팽이 숫자 만들기

D36choi 2020. 5. 2. 17:44
728x90

달팽이숫자?

 

N*N 배열의 숫자가 달팽이모양으로 채워지는 것을 의미.

 

EX) N=3 일때

1 2 3

8 9 4

7 6 5

 

처음접했더니 조금 골치 아팠다. 내 코드가 원시적인거 같기도 하고,

분명 더 똑똑한 방법이 많을듯...

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

#include<iostream>

#define MAX_N 10

using namespace std;

int arr[MAX_N][MAX_N] = {0};

void snail(int N)
{
    int nowx=0;
    int nowy=0;
    int cnt=1;
    for(int t=0; t<N; t++)
    {
        for(int col=nowy; col<N; col++)
        {
            if(!arr[nowx][col])
            {
                arr[nowx][col] = cnt++;
                nowy = col;    
            }
        } // right
 
        for(int row=nowx; row<N; row++)
        {
            if(!arr[row][nowy])
            {
                arr[row][nowy] = cnt++;
                nowx = row;
            }
        } // down
        for(int col=nowy; col>=0--col)
        {
            if(!arr[nowx][col])
            {
                arr[nowx][col] = cnt++;
                nowy = col;    
            }
           
        } // left
        for(int row=nowx; row>=0--row)
        {
            if(!arr[row][nowy])
            {
                arr[row][nowy] = cnt++;
                nowx = row;
            }
        } // up
        
    }
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
        {
            cout<< arr[i][j] << " ";
            arr[i][j] = 0;
        }
        cout<<"\n";
    }
}
cs

여러 방법이 있겠지만 for문 이용하여

오른쪽 아래 왼쪽 위 순으로 배열이 비어있는 경우 채워나가는 방식