알고리즘 연습/구현, 문자열

[🥈4 / 백준 1913 / 파이썬] 달팽이

김세진 2022. 3. 14. 10:24
반응형

 

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

 

문제

홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.

 

 

 

N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.

입력

첫째 줄에 홀수인 자연수 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

 

풀이

 

 

위 그림과 같이 2씩 증가하며 우하좌상 방향으로 4번씩 반복하면서 숫자가 채워지는 것을 알 수 있다.

패턴에 맞춰 수를 채워넣도록 하자.

 

import sys

def draw():
    global n
    x = y = n//2
    cnt = num = 2
    d = [(0,1),(1,0),(0,-1),(-1,0)]
    t = 0
    board[x][y] = 1; x-=1; y-=1

    while True:
        for _ in range(4):
            a,b = d[t]
            for _ in range(cnt):
                x+=a; y+=b
                board[x][y] = num
                if num==m:
                    ans[0]=x+1; ans[1]=y+1
                if num==n**2:
                    return
                num+=1
            t = (t+1)%4
        cnt+=2
        x-=1; y-=1

n = int(input())
m = int(input())
board = [[0]*n for _ in range(n)]
ans = [n//2+1,n//2+1]
draw()
for i in board:
    print(*i)
print(*ans)
반응형