개발/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)