풀이


달팽이 모양으로 N**2 부터 1 까지 수를 표에 맞게 출력하는 문제이다.

이번에도 역시 문제를 꼼꼼히 읽지 못해서 의도치않게 짝수용 풀이까지 만들어버렸다.

하지만 문제에서는 홀수용만 요구하였으니 홀수용 위주로 풀이를 설명하겠다.

홀수형 표는 항상 0, 0 지점에서 N**2 의 숫자가 시작하기 때문에 첫 좌표를 0, 0 으로 지정해준다.

이후 벽을 따라서 숫자가 삽입되기 때문에 dx, dy 를 [하, 우, 상, 좌] 순으로 만들어준다.

숫자가 삽입될 경우마다 패턴이 있는데 N 이 5 인 경우를 예로 들어보겠다.

[하, 우, 상, 좌] 순으로 숫자가 삽입될때마다 순서대로 4번씩 숫자를 입력한 뒤 방향을 전환하는 형식이다.

따라서 25 부터 10 까지 4번씩 방향을 바꿔가며 숫자가 입력되고,

이후 N 이 3 일때 좌표는 1, 1 로 바뀌고 똑같은 패턴을 그대로 적용시킨다.

모든 홀수에 대해서 위 반복이 완료되면 마지막으로 중앙에 위치하는 1 을 입력하면된다.

앞서 설명한 반복문은 N**2 부터 순서대로 숫자가 내려가며 표에 입력되기 때문에 위치를 찾고자 하는 자연수의 차례가 올 경우 그 자연수가 입력될 좌표를 저장하여 추후 정답과 함께 출력하면된다.

소스코드


import sys
input = sys.stdin.readline
 
n = int(input())
num = int(input())
 
snail = [[0]*n for _ in range(n)]
sx, sy = 0, 0
 
# when n == odd
def odd_snail(n, num):
    global sx, sy
    dx = [1, 0, -1, 0]
    dy = [0, 1, 0, -1]
 
    snail[n//2][n//2] = 1
    d = n-1
    a, b = n**2, (n**2)-d
 
    for s in range(n//2):
        x = s
        y = s
        for r in range(4):
            for i in range(a, b, -1):
                if i == num:
                    sx, sy = x, y
                snail[x][y] = i
                nx = x + dx[r]
                ny = y + dy[r]
                x, y = nx, ny
            a = b
            b = b - d 
        b += 2
        d -= 2
 
# when n == even
def even_snail(n, num):
    global sx, sy
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
 
    d = n-1
    a, b = n**2, (n**2)-d
 
    for s in range(n-1, (n-1)//2, -1):
        x = s
        y = s
        for r in range(4):
            for i in range(a, b, -1):
                if i == num:
                    sx, sy = x, y
                snail[x][y] = i
                nx = x + dx[r]
                ny = y + dy[r]
                x, y = nx, ny
            a = b
            b = b - d 
        b += 2
        d -= 2
 
 
if n%2 == 1:
    odd_snail(n, num)
    if num == 1:
        sx, sy = n//2, n//2
else:
    even_snail(n, num)
 
for s in snail:
    print(*s)
print(sx+1, sy+1)

References