N을 입력받아 1부터 N×N까지의 숫자를 바깥쪽에서 안쪽으로 시계 방향으로 채우는 달팽이 배열을 C로 구현했습니다. 한 바퀴마다 오른쪽, 아래, 왼쪽, 위 순서로 채우고 변의 길이를 2씩 줄입니다.
1. 문제
N(최대 25)을 입력받아 N×N 크기의 달팽이 배열을 출력합니다. 예를 들어 N이 4이면 다음과 같습니다.
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
2. 풀이 방법
| 단계 | 이동 | 칸 수 |
| 1 | 오른쪽(x + 1) | a |
| 2 | 아래(y + 1) | a - 1 |
| 3 | 왼쪽(x - 1) | a - 1 |
| 4 | 위(y - 1) | a - 2 |
한 바퀴를 돌면 바깥 테두리가 채워지므로 a를 2 줄여 안쪽 테두리를 같은 방식으로 채웁니다. 바퀴 수는 N / 2이고, N이 홀수이면 마지막에 가운데 한 칸을 채웁니다.
3. 코드
#include <stdio.h>
int main() {
int a, sum = 1, arr[25][25], cnt, m;
int x = -1, y = 0;
scanf("%d", &a);
m = a;
cnt = a / 2; // 바퀴 수
while (cnt > 0) {
for (int i = 0; i < a; i++) { x += 1; arr[y][x] = sum++; } // 오른쪽
for (int i = 0; i < a - 1; i++) { y += 1; arr[y][x] = sum++; } // 아래
for (int i = 0; i < a - 1; i++) { x -= 1; arr[y][x] = sum++; } // 왼쪽
for (int i = 0; i < a - 2; i++) { y -= 1; arr[y][x] = sum++; } // 위
a -= 2;
cnt--;
}
if (m % 2 == 1)
arr[m / 2][m / 2] = sum; // 홀수면 가운데 칸
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++)
printf("%3d", arr[i][j]);
printf("\n");
}
return 0;
}
처음 작성한 코드는 while(1) 안에서 cnt가 0이 되면 빠져나오는 구조였는데, N이 1이면 cnt가 처음부터 0이라 조건을 지나쳐 무한 반복에 빠집니다. 그래서 반복 조건을 while (cnt > 0)으로 바꿨습니다.
4. 정리
- 한 바퀴를 오른쪽 a칸, 아래 a-1칸, 왼쪽 a-1칸, 위 a-2칸으로 채웁니다.
- 바퀴마다 a를 2씩 줄이고, 바퀴 수는 N / 2입니다.
- N이 홀수이면 가운데 칸을 마지막에 채웁니다.
728x90
'Club > EMOTION' 카테고리의 다른 글
| [C] 재귀 함수로 피보나치 수열 출력 (0) | 2018.05.03 |
|---|---|
| [C] 이중 반복문으로 별 찍기 4가지 (0) | 2018.04.02 |
서울
--:--:--
-전체 글
-카테고리
오늘 방문