[BOJ 1913] 달팽이

less than 1 minute read

문제 출처 : https://www.acmicpc.net/problem/1913

풀이

홀수인 N 이 주어지므로, 시작점인 1의 위치는 항상 ($N \over 2$, $N \over 2$) 이다. (0-indexed 배열의 경우) 그 후 위로 한 칸 이동한 다음 시계방향으로 돌면서 다음 숫자가 채워진다. (2, 3, …, $N^2$) 문제의 조건에서 $N \leq 999$ 이므로, $1000 \times 1000$ 배열을 전역으로 선언하여 쉽게 구현 가능하다.

또는 (0,0) 의 위치에서 항상 N^2 으로 시작하는 것에서 착안할 수 있다.

코드

if __name__ == "__main__":
    N = int(input())
    M = int(input())

    a = [[0]*N for _ in range(N)]

    dy = [1,0,-1,0]
    dx = [0,1,0,-1]
    s = N*N
    y = -1
    x = 0
    dir = 0
    ty = 0
    tx = 0
    while s > 0:
      ny = y + dy[dir]
      nx = x + dx[dir]
      if (ny<0 or ny>=N or nx<0 or nx>=N) or a[ny][nx]!=0:
        dir = (dir + 1) % 4
        continue
      y = ny
      x = nx
      a[ny][nx] = s
      if s == M:
        ty = y
        tx = x
      s -= 1

    for i in range(N):
      for j in range(N):
        print(str(a[i][j]), end=" ")
      print("")
    print(str(ty+1) + " " + str(tx+1))

개선할 점

다시 python 으로 PS 연습부터 해보자

Leave a comment