Network & Server Factory

개인 공부 기록

Club/EMOTION

[C] 입력받은 크기의 달팽이 배열 출력

1nfra 2018. 5. 3. 08:20
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
서울
--:--:--
-전체 글
-카테고리
오늘 방문