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)