아래와 같은 5x5 달팽이 모양 사각형을 만들어보자.
* 문제를 푸는 방법에는 여러가지 유형이 있다. 다음은 그중 한가지이다.
우선 내부의 숫자가 채워진 방향을 살펴보면
①~④의 순서대로 채우고, 이것을 채우는 횟수가 0 이 될때 까지 반복한다.
a[6][6] = a[1][1]부터 채우기 위해 6행 6열을 준비했다.
k=0 - 채워질 숫자
x=1, y=0 - 채울 행, 열
변수는 이렇게 준비한다.
①은 5번, a[1][1]부터 차례로 채운다.
a[x][++y] = ++k; 이렇게 하면 x=1 이고 , y는 전치증가연산을 사용해 1 이 된다. 또한 k도 전치증가연산을 하여 1 이 되고 a[x][y]에 저장된다.
따라서 a[1][1]=1, a[1][2]=2, a[1][3]=3, a[1][4]=4, a[1][5]=5 이렇게 채워진다.
②은 4번 a[1][5]부터 차례로 채운다. 단 이번에는 5번이 아닌 4번임을 주의한다.
a[++x][y]=++k; 이렇게 하면 y=5 이고 , x는 전치증가연산을 사용해 2가 된다. 또한 k도 전치증가연산을 하여 6 이 되고 a[x][y]에 저장된다.
따라서 a[2][5]=6, a[3][5]=7, a[4][5]=8, a[5][5]=9 이렇게 채워진다.
③은 4번 a[5][5]부터 ①과 반대 방향으로 차례로 채운다.
a[x][--y]=++k; ①과 반대 방향이므로 x=5 이고 , y는 전치감소연산을 사용해 4 가 된다. 또한 k도 전치증가연산을 하여 10 이 되고 a[x][y]에 저장된다.
따라서 a[5][4]=10, a[5][3]=11, a[5][2]=12, a[5][1]=13 이렇게 채워진다.
④는 3번 a[5][1]부터 ②와 반대 방향으로 차례로 채운다. 단 이번에는 4번이 아닌 3번임을 주의한다.
a[--x][y]=++k; ②와 반대 방향이므로 y=1 이고 , x는 전치감소연산을 사용해 4가 된다. 또한 k도 전치증가연산을 하여 14가 되고 a[x][y]에 저장된다.
따라서 a[4][1]=14, a[3][1]=15, a[2][1]=16 이렇게 채워진다.
이와같은 방식으로 반복횟수가 0 이 될때 까지 계속 진행한다.
소스)
int a[6][6]={0}, n=5; int i, x=1, y=0, k=0; for (::) { // 1번 가로 채우기 for (i=1; i<=n; i++) { a[x][++y]=++k; } // 2번 세로 채우기 n--; // 반복횟수 1감소 if (n<=0) break; for (i=1; i<=n; i++) { a[++x][y]=++k; } // 3번 가로 채우기 for (i=1; i<=n; i++) { a[x][--y]=++k; } // 4번 세로 채우기 n--; // 반복횟수 1감소 if (n<=0) break; for (i=1; i<=n; i++) { a[--x][y]=++k; } }
'C/C++기초' 카테고리의 다른 글
jungol 119 - 디버깅 (0) | 2019.09.11 |
---|---|
파스칼의 삼각형 - C++에서 파스칼 삼각형을 만들어보자 (0) | 2010.11.16 |
비트 연산자, AND OR XOR NOT 쉬프트 연산자를 알아보자 (2) | 2010.10.04 |
하노이의 탑 (0) | 2010.09.28 |
삽입정렬(Insertion sort) - 삽입정렬을 구현해보자 (0) | 2010.09.18 |