문제
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
입력
- 첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.
출력
- N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
입력 예제
7
35
출력 예제
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
문제 풀이
- 위쪽, 오른쪽, 아래, 왼쪽 순으로 방향을 바꿔가며, 값을 저장한다.
- 방향을 바꿨을 때, 이미 그 좌표에 값이 저장되어있거나, 배열의 범위를 넘는 경우 방향을 바꾸기 이전으로 돌려, 원래 방향으로 이동한 후, 값을 저장한다.
- 배열에 위 방식대로 모든 값을 저장한 후, 배열을 모두 출력하고, target 값의 좌표에 1을 더해 출력한다.
코드
# 위오아왼
dy = [-1,0,1,0]
dx = [0,1,0,-1]
n = int(input())
target = int(input())
array = [[0] * n for _ in range(n)]
# 첫 위치
start = n // 2
y = start
x = start
array[start][start] = 1
# 방향좌표
direction = -1
# 2부터 위치 탐색 후, 값 넣기
for i in range(2, n * n + 1):
# 방향 바꿔서 탐색
direction = (direction + 1) % 4
y += dy[direction]
x += dx[direction]
# 이미 값이 저장되어있거나, 범위 넘으면 방향 바꾸지 않음
if 0 > y or y >= n or 0 > x or x >= n or array[y][x] != 0:
y -= dy[direction]
x -= dx[direction]
direction -= 1
if direction == -1:
direction = 3
y += dy[direction]
x += dx[direction]
array[y][x] = i
result_x = 0
result_y = 0
# 배열 값 출력
for i in range(len(array)):
print(*array[i])
if target in array[i]:
result_y = i + 1
result_x = array[i].index(target) + 1
# target 값의 좌표 출력
print(result_y,result_x)
'Algorithm > Simulation' 카테고리의 다른 글
| [JAVA] 백준 14891번 톱니바퀴 (2) | 2023.12.21 |
|---|---|
| [Java] Swea 1961번 숫자 배열 회전 (0) | 2023.07.02 |
| [Python] 백준 17413번 단어 뒤집기2 (0) | 2023.06.17 |
| [Python] 백준 2615번 오목 (0) | 2023.05.25 |
| [Python] 백준 2504번 괄호의 값 (0) | 2023.05.25 |