Algorithm/Jungol (도형만들기2)

[1707] 달팽이 사각형

whereareyoung 2023. 10. 17. 14:46

문제

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

< 처리조건 >

(1) 가장 왼쪽 위의 좌표부터 차례로 숫자를 대입 시킨다.

(2) 오른쪽으로 채워 나가다가 끝이면 다시 아래 → 왼쪽 → 위 →오른쪽의 순으로 모두 채워질 때까지 반복한다.

 

입력

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

출력

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

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


예제1 입력

5

 

예제1 출력

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

 

예제2 입력

2

 

예제2 출력

1 2
4 3


배열을 채우는 위치 이동방법 

 

1) 이동방향별 횟수를 구하여 규칙에 맞게 이동 

2) 범위 바깥부분에 테두리를 쳐서 테두리 내에서 이동

3) 범위를 벗어나지 않도록 조건을 지정해서 이동 

 

1) 규칙을 찾아서 이동

이동방향별 횟수를 구하여 규칙에 맞게 이동 

  첫번째 두번째 세번째
오른쪽(y++) 5 3 1
아래(x++) 4 2 0
왼쪽(y--) 4 2  
위(x--) 3 1  

- 초기값 : x = 1, y = 0, num = 1, m(이동횟수) = n

- 오른쪽, 왼쪽 이동이 끝날때 마다 m--;

- m 이 0이 되면 끝나게 끔 설정 

while(m > 0)
{
	for(i = 1; i <= m; i++)
	{
		arr[x][++y] = num++;
	}
	m--;
    
    	for(i = 1; i <= m; i++)
	{
		arr[++x][y] = num++;
	}
    	for(i = 1; i <= m; i++)
	{
		arr[x][--y] = num++;
	}
	m--;
    
  	 for(i = 1; i <= m; i++)
	{
		arr[--x][y] = num++;
	}
}

 

2) 바깥 부분 테두리 만들기

범위 바깥부분에 테두리를 쳐서 테두리 내에서 이동

- 배열을 0으로 초기화 한 후 1으로 테두리를 싼다. 

- 그 후 0만 채우고, 1일경우 (0이 아닐경우) 방향을 바꾼다. 

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

while(num <= n * n)
{
	while(arr[x][y + 1] == 0) arr[x][++y] = num++;
	while(arr[x + 1][y] == 0) arr[++x][y] = num++;
	while(arr[x][y - 1] == 0) arr[x][--y] = num++;
	while(arr[x - 1][y] == 0) arr[--x][y] = num++;
}

 

<입력 설계>

    int n, i;
    scanf("%d", &n);

    if (n < 1 || n > 100) {
        return 0;
    }
    
    int arr[100][100] = {0};
    int x = 1, y = 0, num = 1, m = n;

- 값 입력을 받기 위해 n 선언 

- 반복문 사용을 위해 i 선언 

- 조건에 부합하지 않을 시 종료 

- 채울 표 크기에 맞는 데이터 크기의 배열 arr 선언 

- 배열을 채우기 위해 사용될 변수들 선언

 

<출력 설계>

1) 규칙을 찾아서 이동 방법을 활용하였다. 

    while (m > 0)
    {
        for (i = 1; i <= m; i++)
        {
            arr[x][++y] = num++;
        }
        m--;

        for (i = 1; i <= m; i++)
        {
            arr[++x][y] = num++;
        }
        for (i = 1; i <= m; i++)
        {
            arr[x][--y] = num++;
        }
        m--;

        for (i = 1; i <= m; i++)
        {
            arr[--x][y] = num++;
        }
    }

 

그 후 채운 arr 배열을 차례로 출력하여주었다. 

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

 

출답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {

    int n, i;
    scanf("%d", &n);

    if (n < 1 || n > 100) {
        return 0;
    }

    int arr[100][100] = {0};
    int x = 1, y = 0, num = 1, m = n;

    while (m > 0)
    {
        for (i = 1; i <= m; i++)
        {
            arr[x][++y] = num++;
        }
        m--;

        for (i = 1; i <= m; i++)
        {
            arr[++x][y] = num++;
        }
        for (i = 1; i <= m; i++)
        {
            arr[x][--y] = num++;
        }
        m--;

        for (i = 1; i <= m; i++)
        {
            arr[--x][y] = num++;
        }
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

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

[5397] 달팽이사각형 (reserved)  (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