[백준] 1913번 달팽이

[백준] 1913번 달팽이

출처: [백준] 1913번 달팽이


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
2 초 128 MB 6337 3430 2684 55.045%

문제

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

1
2
7
35

예제 출력 1

1
2
3
4
5
6
7
8
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

출처


알고리즘 분류


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import sys

input = sys.stdin.readline

N = int(input())
M = int(input())

snail = [[0 for _ in range(N)] for _ in range(N)]

move = [(1, 0), (0, 1), (-1, 0), (0, -1)] # 하, 우, 상, 좌

cur_num = N ** 2
cur_x, cur_y = 0, 0
direction = 0
while cur_num > 0:
snail[cur_y][cur_x] = cur_num
ny, nx = move[direction]
dx = cur_x + nx
dy = cur_y + ny
if 0 > dx or dx >= N or 0 > dy or dy >= N or snail[dy][dx] != 0: # 갈 수 없는 곳만 (방문했던 곳X, 벽X)
direction = (direction + 1) % 4

ny, nx = move[direction]
cur_x += nx
cur_y += ny
cur_num -= 1

temp_x, temp_y = 0, 0
for i in range(N):
for j in range(N):
if snail[i][j] == M:
temp_x = j
temp_y = i
print(snail[i][j], end=" ")
print()
print(temp_y + 1, temp_x + 1)

Author

Chaehyeon Lee

Posted on

2021-06-22

Updated on

2021-06-22

Licensed under

댓글