Notice
Recent Posts
Recent Comments
Link
DY N DY
실력키우기 달팽이사각형(C++) 본문
1707 : 달팽이사각형
제한시간: 1Sec 메모리제한: 64mb
해결횟수: 1539회 시도횟수: 3113회
정사각형의 크기를 입력 받은 후 시계방향으로 돌면서 다음과 같은 형태로 출력하는 프로그램을 작성하시오.
< 처리조건 >
(1) 가장 왼쪽 위의 좌표부터 차례로 숫자를 대입시킨다.
(2) 오른쪽으로 채워 나가다가 끝이면 다시 아래 → 왼쪽 → 위 →오른쪽의 순으로 모두 채워질때까지 반복한다.
[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문을 돌며 배열에 수를 저장하고 최종적으로 출력하게 된다.
'PARK > ALGORITHM' 카테고리의 다른 글
실력키우기 문자삼각형1(JAVA) (0) | 2016.04.12 |
---|---|
알고리즘 저글링 방사능 오염(JAVA) (0) | 2016.04.12 |
알고리즘 색종이만들기(C++) (0) | 2016.04.11 |
실력키우기 소수구하기(C++) (0) | 2016.04.10 |
실력키우기 각 자릿수의 합(C++) (0) | 2016.04.07 |