Algorithm/Jungol (도형만들기2)

[5397] 달팽이사각형 (reserved)

whereareyoung 2023. 10. 17. 16:10

문제

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

 

크기가 5일 경우

입력

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

출력

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

숫자 사이는 공백으로 구분한다.​ 


예제1 입력

5

 

예제1 출력

5 4 3 2 1
6 19 18 17 16
7 20 25 24 15
8 21 22 23 14
9 10 11 12 13

 

예제2 입력

2

 

예제2 출력

2 1
3 4


<입력 설계>

int main() 
{
    int n;
    scanf("%d", &n);

    if (n <= 0 || n > 100)
    {
        return 0;
    }
    else
    {
        reverseSnail(n);
    }

    return 0;
}

- 데이터 값 n을 입력받고 조건에 부합하지 않을경우 종료

- 조건에 부합할 경우 함수를 통해 값을 구하고 출력

 

<출력 설계>

void reverseSnail(int n) {

    int top = 0, bottom = n - 1, left = 0, right = n - 1;
    int num = 1;
    int target = n * n;

    while (num <= target) {

        // 오른쪽 위에서 왼쪽 위로
        for (int i = right; i >= left; i--) {
            arr[top][i] = num;
            num++;
        }
        top++;

        // 왼쪽 위에서 왼쪽 아래로
        for (int i = top; i <= bottom; i++) {
            arr[i][left] = num;
            num++;
        }
        left++;

        // 왼쪽 아래에서 오른쪽 아래로
        for (int i = left; i <= right; i++) {
            arr[bottom][i] = num;
            num++;
        }
        bottom--;

        // 오른쪽 아래에서 오른쪽 위로
        for (int i = bottom; i >= top; i--) {
            arr[i][right] = num;
            num++;
        }
        right--;
    }

    // 배열 출력
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

}

 

<시간 설계>

#include <stdlib.h>

	//동적 배열 메모리 할당
    int** arr = (int**)malloc(n * sizeof(int*));
    for (int i = 0; i < n; i++) {
        arr[i] = (int*)malloc(n * sizeof(int));
    }
    
    // 배열 값 출력
    
    // 동적으로 할당된 배열 메모리 해제
    for (int i = 0; i < n; i++) {
        free(arr[i]);
    }
    free(arr);

 

 

출답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void reverseSnail(int n) {

    int **arr = (int **)malloc(n * sizeof(int *));
    for (int i = 0; i < n; i++) {
        arr[i] = (int *)malloc(n * sizeof(int));
    }

    int top = 0, bottom = n - 1, left = 0, right = n - 1;
    int num = 1;
    int target = n * n;

    while (num <= target) {

        // 오른쪽 위에서 왼쪽 위로
        for (int i = right; i >= left; i--) {
            arr[top][i] = num;
            num++;
        }
        top++;

        // 왼쪽 위에서 왼쪽 아래로
        for (int i = top; i <= bottom; i++) {
            arr[i][left] = num;
            num++;
        }
        left++;

        // 왼쪽 아래에서 오른쪽 아래로
        for (int i = left; i <= right; i++) {
            arr[bottom][i] = num;
            num++;
        }
        bottom--;

        // 오른쪽 아래에서 오른쪽 위로
        for (int i = bottom; i >= top; i--) {
            arr[i][right] = num;
            num++;
        }
        right--;
    }

    // 배열 출력
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%2d ", arr[i][j]);
        }
        printf("\n");
    }

    // 동적으로 할당된 배열 메모리 해제
    for (int i = 0; i < n; i++) {
        free(arr[i]);
    }
    free(arr);
}

int main() {
    int n;
    scanf("%d", &n);

    if (n <= 0 || n > 100) 
    {
        return 0;
    }
    else 
    {
        reverseSnail(n);
    }

    return 0;
}

 

'Algorithm > Jungol (도형만들기2)' 카테고리의 다른 글

[1707] 달팽이 사각형  (0) 2023.10.17
[1641] 숫자삼각형  (0) 2023.10.17
[1329] 별삼각형3  (1) 2023.10.17
[1719] 별삼각형2  (0) 2023.10.17
[1523] 별삼각형1  (0) 2023.10.17