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의 좌표는
입력
첫째 줄에 홀수인 자연수 N
출력
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
'IT > Python' 카테고리의 다른 글
[백준] 10825번 국영수 [Python] - 정렬 0 | 2023.08.09 |
---|---|
[백준] 2578번 빙고 [Python] 0 | 2023.08.08 |
[백준] 1269번 대칭 차집합 [Python] - 집합 0 | 2023.08.07 |
[백준] 1002번 터렛 [Python] - 두 원의 위치 관계 0 | 2023.08.07 |