-- 예전 기록/BOJ

[ BOJ ] 1913 : 달팽이 ( SILVER 3 ) / Python

rejo 2024. 2. 10. 14:10

홀수인 자연수 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)