1. 출력은 r1행부터 r2행까지 차례대로 출력
2. 각 원소는 공백으로 구분
3. 모든 행은 같은 길이
4. 공백의 길이는 최소한
5. 모든 숫자의 길이(앞에 붙는 공백을 포함)은 동일
6. 수의 길이가 가장 길이가 긴 수보다 작다면 왼쪽에서부터 공백을 삽입해 길이를 맞춤
다음과 같이 (0,0)을 중심으로 하는 같은 길이의 정사각형을 보면, 하늘색 기준선의 아랫 부분은 파란색으로 숫자를 이용해서 값을 구하고, 하늘색 기준선의 윗 부분은 파란색으로 표시한 숫자를 이용해서 값을 구할 수 있다. 따라서 녹색 정사각형 내부의 원소들의 위치의 값들을 구할 땐 파란색으로 표시한 숫자를 구해 r과 c값 차이를 빼서 값을 구할 수 있다.
(r, c)에 들어갈 숫자를 구해보자.
- 기준이 될 숫자의 값을 구한다.
r, c의 절댓값 중 큰 값을 n이라고 하자
- 이 때 기준이 될 숫자의 좌표는 고정이다. 따라서 r, c값의 차이를 이용해 실제 들어갈 값을 다음과 같이 구할 수 있다.
- 위와 같은 공식을 이용해 좌표 (r, c)의 값들을 바로 계산할 수 있다.
위 공식을 기반으로 좌표에 해당하는 값을 계산하고 문제의 조건에 맞춰 다음과 같이 '예쁘게'출력해줄 수 있다.
import math
digit = int(math.log10(digit)) + 1
for i in ans:
for j in i:
print(str(j).rjust(digit), end=" ")
print()
이 때 자리수를 구해야 왼쪽에 공백을 필요한 만큼 삽입해서 정렬이 가능하므로 math 모듈의 log10을 이용해 자리수를 구할 수 있다. rjust(int, char) 함수는 문자열을 오른쪽 정렬해주는데 int 길이만큼 부족한 부분을 char로 채운다. char을 따로 지정해주지 않으면 공백으로 기본값이 주어진다.
r1, c1, r2, c2 = map(int, input().split())
ans = [[0 for _ in range(c2 - c1 + 1)] for _ in range(r2 - r1 + 1)]
digit = 0
for r in range(r2 - r1 + 1):
for c in range(c2 - c1 + 1):
R = r1 + r
C = c1 + c
ans[r][c] = [R, C]
n = max(abs(R), abs(C))
if R >= C:
ans[r][c] = (((n * 2) + 1) ** 2) - (abs(n - R) + abs(n - C))
else:
ans[r][c] = 4 * (n**2) - (abs((-n) - R) + abs((-n + 1) - C))
if ans[r][c] > digit:
digit = ans[r][c]
import math
digit = int(math.log10(digit)) + 1
for i in ans:
for j in i:
print(str(j).rjust(digit), end=" ")
print()