Dev/Algorithm
[백준] #1913 달팽이 - 파이썬
jusep
2025. 11. 3. 17:43
문제
홀수인 자연수 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번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
예제 입력 1
7
35
예제 출력 1
49 26 27 28 29 30 31
48 25 10 11 12 13 32
47 24 9 2 3 14 33
46 23 8 1 4 15 34
45 22 7 6 5 16 35
44 21 20 19 18 17 36
43 42 41 40 39 38 37
5 7
N = int(input()) # N>=3
target = int(input())
arr = [[0] * N for _ in range(N)]
r, c = N//2, N//2
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
k = 1 # 현재 채울 숫자
direction = 0
step_length = 1
turn_count = 0
steps_taken = 0
while k <= N*N:
arr[r][c] = k
if k == target:
target_pos = [r+1, c+1]
k += 1
steps_taken += 1
r = r+dr[direction]
c = c+dc[direction]
if steps_taken == step_length:
steps_taken = 0
direction = (direction+1)%4
turn_count += 1
if turn_count == 2:
turn_count = 0
step_length += 1
for i in range(N):
print(*arr[i])
print(*target_pos)