보관함

JUNGOL 실력키우기 도형만들기2 - 달팽이삼각형 | 달팽이사각형

niamdank 2020. 1. 24. 10:41

기초 다지기에서 배운 내용을 응용하여 문제를 해결해야 하는 실력 키우기입니다.

실력 키우기는 비슷한 문제 유형별로 묶어서 풀어보겠습니다.

 

이번 포스팅에서는 도형만들기2의 달팽이 시리즈를 풀어보겠습니다.


1337 : 달팽이삼각형

 

이 문제는 기본적으로 우 하단으로 이동하는 것, 왼쪽으로 이동하는 것, 상단으로 이동하는 것을 분리하여 처리해야 합니다. 그리고 종료 조건은 이 세 이동을 모두 할 수 없는 경우가 됩니다.

 

저는 기본적으로 다음에 이동해야 할 위치에 값이 있거나 최대로 이동한 경우(n에 도달 또는 배열의 경계에 도달) 값을 증가시키지 않고 저장하고 반복문을 빠져나오도록 처리했습니다.

 

#include <iostream>

using namespace std;

int arr[101][101];

int main(void)
{
    int n;
    cin >> n; 

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

    for(int i=0, j=0, num=0; ;)
    {
        bool isContinue{ false };

        while (true)
        {
            if (i + 1 == 100 || i + 1 == n || arr[i + 1][j + 1] != -1)
            {
                arr[i][j] = num;
                break;
            }
            isContinue |= true;
            arr[i++][j++] = num++;

            if (num > 9)
                num = 0;
        }

        while (true)
        {
            if (j == 0 || arr[i][j - 1] != -1)
            {
                arr[i][j] = num;
                break;
            }
            isContinue |= true;
            arr[i][j--] = num++;

            if (num > 9)
                num = 0;
        }

        while (true)
        {
            if (i == 0 || arr[i - 1][j] != -1)
            {
                arr[i][j] = num;
                break;
            }
            isContinue |= true;
            arr[i--][j] = num++;

            if (num > 9)
                num = 0;
        }

        if (!isContinue)
            break;
    }

    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j <= i; ++j)
        {
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }
}

 

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=609&sca=2020

 

JUNGOL | 달팽이삼각형 > 문제은행

삼각형의 높이 N을 입력받아서 아래와 같이 숫자 0부터 달팽이 모양으로 차례대로 채워진 삼각형을 출력하는 프로그램을 작성하시오. < 처리조건 > 왼쪽 위부터 시계방향으로 오른쪽 아래로 이동하면서 숫자 0부터 N개를 채우고  다시 왼쪽으로, 다음은 위쪽으로 반복하면서 채워 나간다. (숫자 9 다음에는 0부터 다시 시작한다.) 삼각형의 한변의 길이 N(N의 범위는 100 이하의 양의 정수)을 입력받는다. 주어진 형태대로 높이가 N인 달팽이 삼각형을 출력한다.

www.jungol.co.kr

 

1707 : 달팽이사각형

 

이 문제는 달팽이 삼각형에서 방향이 한 개 추가된 것외에는 동일하게 풀 수 있는 문제입니다.

 

#include <iostream>

using namespace std;

int arr[101][101];

int main(void)
{
    int n;
    cin >> n; 

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

    for(int i=0, j=0, num=1; ;)
    {
        bool isContinue{ false };

        while (true)
        {
            if (j + 1 == 100 || j + 1 == n || arr[i][j + 1] != -1)
            {
                arr[i][j] = num;
                break;
            }
            isContinue |= true;
            arr[i][j++] = num++;
        }

        while (true)
        {
            if (i + 1 == 100 || i + 1 == n || arr[i + 1][j] != -1)
            {
                arr[i][j] = num;
                break;
            }
            isContinue |= true;
            arr[i++][j] = num++;
        }

        while (true)
        {
            if (j == 0 || arr[i][j - 1] != -1)
            {
                arr[i][j] = num;
                break;
            }
            isContinue |= true;
            arr[i][j--] = num++;
        }

        while (true)
        {
            if (i == 0 || arr[i - 1][j] != -1)
            {
                arr[i][j] = num;
                break;
            }
            isContinue |= true;
            arr[i--][j] = num++;
        }

        if (!isContinue)
            break;
    }

    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }
}

 

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=980&sca=2020

 

JUNGOL | 달팽이사각형 > 문제은행

정사각형의 크기를 입력 받은 후 시계방향으로 돌면서 다음과 같은 형태로 출력하는 프로그램을 작성하시오. < 처리조건 > (1) 가장 왼쪽 위의 좌표부터 차례로 숫자를 대입시킨다. (2) 오른쪽으로 채워 나가다가 끝이면 다시 아래 → 왼쪽 → 위 →오른쪽의 순으로 모두 채워질때까지 반복한다. 정사각형의 크기 n(1부터 100사이의 정수)을 입력받는다. 위에서 언급한 형태로 정사각형의 내부 숫자를 차례로 채운 후의 모습을 출력한다. 숫자 사이는 공백으로 구분

www.jungol.co.kr