DY N DY

실력키우기 달팽이사각형(C++) 본문

PARK/ALGORITHM

실력키우기 달팽이사각형(C++)

손세지 2016. 4. 12. 00:58

1707 : 달팽이사각형

제한시간: 1Sec    메모리제한: 64mb
해결횟수: 1539회    시도횟수: 3113회   



정사각형의 크기를 입력 받은 후 시계방향으로 돌면서 다음과 같은 형태로 출력하는 프로그램을 작성하시오.


< 처리조건 >
(1) 가장 왼쪽 위의 좌표부터 차례로 숫자를 대입시킨다. 
(2) 오른쪽으로 채워 나가다가 끝이면 다시 아래 → 왼쪽 → 위 →오른쪽의 순으로 모두 채워질때까지 반복한다.


e3050b66a1b29a01767400d7560a4131_1449725
 


 

 

정사각형의 크기 n(1부터 100사이의 정수)을 입력받는다.



위에서 언급한 형태로 정사각형의 내부 숫자를 차례로 채운 후의 모습을 출력한다.
숫자 사이는 공백으로 구분한다.


 [Copy]
3
 [Copy]
1 2 3
8 9 4
7 6 5



 [Copy]
2
 [Copy]
1 2
4 3
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**************************************************************
    Problem: 1707
    User: a132034
    Language: C++
    Result: Success
    Time:1 ms
    Memory:1740 kb
****************************************************************/
 
 
#include    <iostream>
using namespace std;
 
int main()
{
    int N;
    int**R;
 
    cin >> N;
    R = new int*[N];
    for (int i = 0; i < N; ++i)
        R[i] = new int[N];
 
    int i = 1;
    int x = 0, y = 0;
    int n = N;
    int xx = 0 , yy = 0;
   
    while (N >= 0)
    {      
        for (int j = 0; j < N; ++j)
        {
            R[yy][xx++] = i++;
        }
 
        N--;
        xx--;
        yy++;
        for (int j = 0; j < N; ++j)
        {
            R[yy++][xx] = i++;
        }
 
        yy--;
        xx--;
        for (int j = 0; j < N; ++j)
        {
            R[yy][xx--] = i++;
        }
        xx++;
        N--;
        yy--;
        for (int j = 0; j < N; ++j)
        {
            R[yy--][xx] = i++;
        }          
         
        xx = ++x;
        yy = ++y;
 
    }
 
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            cout << R[i][j] << " ";
        }
        cout << endl;
    }
 
}


변수와 그림을 그려가면서 확인하면 확인할 수 있는 공식도 나오고 어려운 문제는 아닌데 생각만 하고 끄적이지 않으면 조금 어려울 수도 있다.

4가지 방향으로 풀 수 있는데 좌측 -> 하단 -> 우측 -> 상단 순서로 가게 된다. 이 때 좌측에서 하단, 우측에서 상단으로 가면서 한 칸씩 덜 가게 된다.

이를 표현한 것이 N--; 

ex) 1 2 3 4 5(좌측 5회) -> 6 7 8 9(하단 4회) -> 10 11 12 13(우측 4회) -> 14 15 16(상단 3회) 

시작은 0,0 -> 1,1 -> 2,2 순서로 안쪽으로 들어가게 된다. 

가는 횟수는 입력받은 N을 가지고 표현하였으며 계속 N이 변화하기 떄문에 출력용 n변수를 따로 만들었다.

갈 수 있는 횟수 N이 0이 될 때까지 while문을 돌며 배열에 수를 저장하고 최종적으로 출력하게 된다.