개발/algorithm

[백준 1913번] 달팽이 - python

zzi_on2 2022. 3. 17. 19:34

문제링크

 https://www.acmicpc.net/problem/1913

 

1913번: 달팽이

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

www.acmicpc.net

풀이

- 구현 문제

오른쪽, 아래, 왼쪽, 위 순서로 0번, 2번, 4번, 6번 ... 개수 만큼 숫자 입력 

- 좌표 값을 구하고자 하는 숫자가 1일 때에 주의해야 한다. 이것 때문에 시간 오래 걸림 ㅠㅠ 

import sys
input = sys.stdin.readline

n = int(input())
m = int(input())

# 오른쪽, 아래쪽, 왼쪽, 위쪽 
dx = [ 0, 1, 0, -1 ]
dy = [ 1, 0, -1, 0 ]

graph = [ [0] * n  for _ in range(n) ]
# 시작 위치 
x = n // 2
y = n // 2
# 시작 숫자 
num = 1
# 가운데 시작 숫자 입력 
graph[x][y] = num
# 반복할 횟수 
len = 0 
# 구하고자 하는 숫자의 좌표값 저장 
answer = []
    
# 좌표값을 구하고자 하는 숫자가 1일 때는 미리 넣어줘야 함 
if m == 1 :
    answer.append(x+1)
    answer.append(y+1)
    
while True:
    # 네 방향에 대하여 len 만큼 이동하여 숫자 넣기 
    for i in range(4):
        for _ in range(len):
            x += dx[i]
            y += dy[i]
            num += 1 
            graph[x][y] = num
            # 구하고자 하는 숫자라면 
            if num == m:
                answer.append(x+1)
                answer.append(y+1)            
     
    if x == y == 0:
        break
    # 끝난 위치의 대각선 왼쪽 위에서부터 시작 
    x -= 1
    y -= 1
    # 반복할 횟수 증가 
    len += 2
    
for i in graph:
    print(*i)
print(*answer)