본문 바로가기

Algorithm/백준

백준 1022번 소용돌이 예쁘게 출력하기 (c++)

소용돌이는 여러개의 정사각형들이 둘러쌓여 있는 것으로 볼 수 있다.

정사각형의 각변에서 숫자가 어떻게 늘어가는지 규칙을 찾아서 출력해주면 된다.

1. 정사각형의 오른쪽 변 

행이 위로 올라갈수록 숫자가 증가한다. 행은 변수 i 로 받아서 관리하고, 위로 올라가는 것은 i가 감소하는 것을 의미한다. 그래서 startNum -i 임을 알 수 있고 -i , -i + 1, -i +2 ,..., i 를 0,1,2,3,... i *2 로 바꾸기 위해서 j 를 더해준다.

오른쪽 변이 j이므로 j는 항상 고정된 값이다. 그래서 startNum - i + j 가 오른쪽 변의 숫자 공식이 된다.

2. 정사각형의 위쪽 변, 왼쪽, 아래쪽 변도 동일한 방법으로 수식을 적을 수 있다.

숫자의 최대값을 구하고, 최대값의 길이만큼 공백을 주어서 출력하는 코드도 추가하면 문제가 해결된다.

#include <iostream>
#include <cmath>

using namespace std;

int numLen(int num)
{
    int len = 0;
    while (num > 0)
    {
        len++;
        num /= 10;
    }
    return len;
}
int findMax(int r1, int c1, int r2, int c2)
{
    int maxNum = 0;
    for (int i = r1; i <= r2; i++)
    {
        for (int j = c1; j <= c2; j++)
        {
            int maxIdx = max(abs(i), abs(j));
            int width = maxIdx * 2 + 1;
            int lastNum = (width - 2) * (width - 2);
            int num;
            if (i == -maxIdx)
            {
                int startNum = lastNum + (width - 1);
                num = startNum - j - i;
            }
            else if (j == -maxIdx)
            {
                int startNum = lastNum + (width - 1) * 2;
                num = startNum - j + i;
            }
            else if (i == maxIdx)
            {
                int startNum = lastNum + (width - 1) * 3;
                num = startNum + i + j;
            }
            else if (j == maxIdx)
            {
                int startNum = lastNum;
                num = startNum - i + j;
            }
            maxNum = max(num, maxNum);
        }
    }
    return maxNum;
}

int main()
{
    int r1, c1, r2, c2;
    cin >> r1 >> c1 >> r2 >> c2;

    int maxSize = findMax(r1, c1, r2, c2);
    int maxLen = 0;
    //cout << maxSize << endl;
    while (maxSize > 0)
    {
        maxLen++;
        maxSize /= 10;
    }
    for (int i = r1; i <= r2; i++)
    {
        for (int j = c1; j <= c2; j++)
        {
            int maxIdx = max(abs(i), abs(j));
            int width = maxIdx * 2 + 1;
            int lastNum = (width - 2) * (width - 2);
            //         cout << "max Idx " << maxIdx << endl;
            //cout << "last " << lastNum << endl;
            if (i == -maxIdx)
            {
                int startNum = lastNum + (width - 1);
                int num = startNum - j - i;
                int len = numLen(num);
                //cout << "len " << maxLen << " " << len;
                for (int i = 0; i < maxLen - len; i++)
                {
                    cout << " ";
                }
                cout << startNum - j - i << " ";
                //printf(format, startNum - j - i);
            }
            else if (j == -maxIdx)
            {
                int startNum = lastNum + (width - 1) * 2;
                int num = startNum - j + i;
                int len = numLen(num);
                for (int i = 0; i < maxLen - len; i++)
                {
                    cout << " ";
                }
                cout << startNum - j + i << " ";
            }
            else if (i == maxIdx)
            {
                int startNum = lastNum + (width - 1) * 3;
                int num = startNum + i + j;
                int len = numLen(num);
                for (int i = 0; i < maxLen - len; i++)
                {
                    cout << " ";
                }
                cout << startNum + i + j << " ";
            }
            else if (j == maxIdx)
            {
                int startNum = lastNum;
                int num = startNum - i + j;
                int len = numLen(num);
                for (int i = 0; i < maxLen - len; i++)
                {
                    cout << " ";
                }
                cout << startNum - i + j << " ";
            }
        }
        cout << endl;
    }
    return 0;
}
반응형

'Algorithm > 백준' 카테고리의 다른 글

백준 2251번 물통(Java)  (0) 2021.04.11
백준 1027번 고층 건물 (c++)  (0) 2021.03.07
백준 2075번 N번째 큰 수 (c++)  (0) 2021.02.22
백준 1774번 우주신과의 교감 (c++)  (0) 2021.02.21
백준 2638번 치즈 (c++)  (0) 2021.02.19