소용돌이는 여러개의 정사각형들이 둘러쌓여 있는 것으로 볼 수 있다.
정사각형의 각변에서 숫자가 어떻게 늘어가는지 규칙을 찾아서 출력해주면 된다.
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 |