C언어 배열 질문입니다!!ㅠㅡㅠ

조회수 844회
#include <stdio.h>

int main(void)
{
    int t,n;
    int tarr[10][10];

    scanf("%d", &t);

    for (int c = 1; c <= t; c++)
    {
        scanf("%d", &n); //n x n의 달팽이 배열 
        printf("#%d\n", c); //몇 번째 테스트 인지
        int num = 1;
        int m = n;
        int x = 0, y = 0, p = 1;

        while (m > 0)
        {
            for (int i = 0; i < m; i++)
            {
                tarr[x][y] = num;
                num++;
                y = y + p;
                if (y >= n || y < 0)
                {
                    y = y - p;
                }
            }
            m--;

            for (int i = 0; i < m; i++)
            {
                x = x + p;
                tarr[x][y] = num;
                num++;
            }
            p = -p;
            y = y + p;

        }

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

    }

    return 0;
}

문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE&&& 달팽이는 1부터 N*N까지의 숫자가 시계방향으로 이루어져 있다.

다음과 같이 정수 N을 입력 받아 N크기의 달팽이를 출력하시오.

[예제]

N이 3일 경우,

이미지

N이 4일 경우,

이미지

[제약사항]

달팽이의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)

[입력]

가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스에는 N이 주어진다.

[출력]

각 줄은 '#t'로 시작하고, 다음 줄부터 빈칸을 사이에 두고 달팽이 숫자를 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

위 문제에 대해 제가 작성한 코드입니다. 실행해보면

이미지

이런 결과가 나옵니다. 3을 입력했을 때는 정상적으로 작동하는데 4를 입력하면 오류가 떠요ㅠㅠ 계속 수정 중인데 어디를 건드려야 할지 모르겠어요ㅠㅠㅠㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 문제로 제공된 링크를 클릭하면 인증하라고 합니다. 정영훈 2019.10.9 23:34
  • 질문 수정했습니다!! 알 수 없는 사용자 2019.10.10 17:03

2 답변

  • 이해하기 쉽게 다른 방식으로 해석해 봅시다.

    정방형의 타일맵 위를 움직이는 로봇이 있습니다.

     - 한 번에 타일 한 칸씩 움직일 수 있습니다.
     - 이미 한 번 방문한 타일이나 맵 밖으로는 이동이 불가능합니다.
     - 이 로봇의 이동 우선순위는 다음과 같습니다.
       => 우 하 좌 상 
     - 우선순위에 따라 다음 타일로 이동합니다.
     - 이동한 위치에는 몇 번째 방문한 타일인지 기록합니다.
     - 사방이 막혀 있다면 이동을 종료합니다.
     - 시작 지점은 좌상단입니다.
    

    이동할 위치에 대한 룩업을 시도해 보고 갈 수 없으면 다음 우선순위의 방향으로 같은 로직을 시도합니다.

    움직일 수 없을 때 종료 로직과

    룩업에 필요한 조건문

    우선순위를 고려한 if ~ else ~

    움직였을때 값을 쓰는 작업

    이것들을 적절히 스까서 작성하면 될 것 같네요.

  •                 if (y >= n || y < 0)
                    {
                        y = y - p;
                    }
    

    여기서 조건이 잘못되었습니다. 이 조건은 n x n 사각영역 바깥으로 나갔는지만 검사하는데, 방향을 꺽어야 할 조건은 그것만이 아닙니다. 사각영역 안이라도 숫자가 이미 차 있는 경우에도 방향을 꺽어야 합니다.

    • 숫자가 이미 차 있는 경우에도 방향을 꺽어야 한다는 말이 어떤 뜻인가요?? C언어 시작한지 얼마 안되서 너무 어렵네요ㅠㅠ 알 수 없는 사용자 2019.10.10 17:06
    • 4x4 에서 14까지 쓰고서 15를 어디에 쓸까요? nowp 2019.10.10 17:23

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)