카테고리 없음

[Python/파이썬] 백준 1913번 달팽이

딜레이레이 2023. 4. 22. 09:49
 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

 

문제

홀수인 자연수 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번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.


코드

n = int(input()) # 홀수
pos = int(input())

map_data = [[0] * n for _ in range(n)]
dir = [(1, 0), (0, 1), (-1, 0), (0, -1)]
r, c = 0, 0 
d = 0   # 회전 인덱스
map_data[0][0] = n ** 2
for num in range(n**2-1, 0, -1):
    nr = r + dir[d][0]
    nc = c + dir[d][1]
    # 회전
    if nr < 0 or nr >= n or nc < 0 or nc >= n or map_data[nr][nc] != 0:
        d += 1
        d %= 4
        nr = r + dir[d][0]
        nc = c + dir[d][1]
    map_data[nr][nc] = num
    r, c = nr, nc

find_num = []
for i in range(n):
    for j in range(n):
        if map_data[i][j] == pos:
            find_num = [i+1, j+1]
        print(map_data[i][j], end=' ')
    print()
print(*find_num)