Algorithm/Simulation

[Python] 백준 1913번 달팽이

코딩쪼앙 2023. 6. 17. 18:15

문제

 

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)