Processing math: 100%
본문 바로가기

IT/Python

[백준] 1913번 달팽이 [Python]

728x90

숫자를 달팽이 모양을 그리며 순서대로 배치하고,

입력받은 숫자의 좌표를 구하는 문제

더보기

문제

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

 

달팽이 모양 행렬을 만들면서 입력 받은 숫자의 좌표를 구하니가 중간에 계속 NameError가 떠서(이유는 모르겠어요ㅜㅜ)

행렬을 다 채워 넣은 후에 좌표를 찾았더니 성공했습니다.

N = int(input())
x = int(input())

td = [[[] for _ in range(N)] for _ in range(N)] # NxN 행렬 생성
M = (N - 1)//2
o = [M,M]	# 행렬 중심 좌표
num = 1		# 1부터 시작
td[M][M] = num
for i in range(1, N, 2):	# 중심에서 왼쪽 위 대각선으로 한 칸 이동
    o[0] -= 1
    o[1] -= 1
    for d in ((0,1),(1,0),(0,-1),(-1,0)):	# 오른쪽, 아래, 왼쪽, 위 (달팽이 모양 방향)
        dx, dy = d[0], d[1]
        for _ in range(i+1):
            o[0] += dx
            o[1] += dy
            num += 1	# 숫자를 증가시키면서 입력
            td[o[0]][o[1]] = num
for r in td:
    print(*r)

# 입력 받은 숫자의 좌표 구하기
for row in range(N):
    for col in range(N):
        if td[row][col] == x:
            print(*(row + 1, col + 1))
            exit()

 

이런 식으로 오른쪽, 아래, 왼쪽, 위 방향으로 이동 할 수도 있습니다.

dx, dy = (0, 1, 0, -1), (1, 0, -1, 0)
o = [M,M]
num = 1
td[M][M] = num
for i in range(1, N, 2):
    o[0] -= 1
    o[1] -= 1
    for j in range(4):
        for _ in range(i+1):
            o[0] += dx[j]
            o[1] += dy[j]

 

더보기

예제 입력 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