홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.
9 | 2 | 3 |
8 | 1 | 4 |
7 | 6 | 5 |
25 | 10 | 11 | 12 | 13 |
24 | 9 | 2 | 3 | 14 |
23 | 8 | 1 | 4 | 15 |
22 | 7 | 6 | 5 | 16 |
21 | 20 | 19 | 18 | 17 |
N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.
입력
첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
출력
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
풀이 과정
중앙부터 달팽이 모양으로 숫자를 채운다.
숫자를 채우는 원리는 다음과 같다.
import sys
input = sys.stdin.readline
n = int(input().rstrip())
k = int(input().rstrip())
result = []
arr = [[0 for _ in range(n)] for _ in range(n)]
now = [n//2, n//2]
row = [-1, 0, 1, 0]
col = [0, 1, 0, -1]
dir = 0
cnt = 0
num = 1
num_plus_cnt = 0
now_num = 1
while 0 <= now[0] < n and 0 <= now[1] < n:
if now_num == k:
result = [now[0], now[1]]
arr[now[0]][now[1]] = now_num
now_num += 1
now[0] += row[dir]
now[1] += col[dir]
cnt += 1
if num == cnt:
cnt = 0
dir = (dir + 1) % 4
num_plus_cnt += 1
if num_plus_cnt == 2:
num += 1
num_plus_cnt = 0
for i in range(n): print(' '.join(map(str, arr[i])))
print(result[0]+1, result[1]+1)
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 1522 : 문자열 교환 ( SILVER 1 ) / Python (0) | 2024.02.10 |
---|---|
[ BOJ ] 15664 : N과 M (10) ( SILVER 2 ) / Python (0) | 2024.02.10 |
[ BOJ ] 3036 : 링 ( SILVER 4 ) / Python (0) | 2024.02.10 |
[ BOJ ] 3584 : 가장 가까운 공통 조상 ( GOLD 4 ) / Python (0) | 2024.02.09 |
[ BOJ ] 17471 : 게리맨더링 ( GOLD 4 ) / Python (0) | 2024.02.09 |