코딩하는 해맑은 거북이
[Python] 달팽이 - 백준 본문
해당 글은 백준 1913번 문제 '달팽이'를 다룬다.
문제
https://www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
설명
해당 문제는 중앙점(r, c) = (n//2, n//2)에서 시작해서 상좌하우 순으로 이동해가며 표에 숫자를 채워나가면 된다.
5x5 표의 규칙을 찾아보면 중앙점에서 상1 → 좌1 → 하2 → 우2 → 상3 → 좌3 → 하4 → 우4 → 상4(마지막) 로 진행된다.
이때 마지막을 제외하고 방향이 하, 상일때 이동하는 길이가 +1이 되는 것을 볼 수 있다.
이를 이용해서 표를 다 채울 수 있다.
코드
n = int(input())
m = int(input())
data = [[0]*n for _ in range(n)]
#상좌하우
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
r = n//2
c = n//2
data[r][c] = 1
len = 1
dir = 0
num = 2
mx, my = r, c
while True:
for i in range(len): # 1 1 2 2 3 3 4 4 5
nx = r + dx[dir]
ny = c + dy[dir]
data[nx][ny] = num
if m == num: # 숫자 m의 위치 저장
mx, my = nx, ny
num += 1
r, c = nx, ny
if r == 0 and c == 0: # 마지막 (0, 0)은 패스하기
break
if num > n*n:
break
dir = (dir+1)%4
if dir == 0 or dir == 2:
len += 1
for i in range(n):
for j in range(n):
print(data[i][j], end=' ')
print()
print(mx+1, my+1)
'코딩테스트' 카테고리의 다른 글
[Python] 회전하는 큐 - 백준 (0) | 2023.01.21 |
---|---|
[Python] 풍선 터뜨리기 - 백준 (0) | 2023.01.21 |
[Python] 퇴사 - 백준 (DP) (0) | 2023.01.20 |
[Python] 귤 고르기 - 프로그래머스 (0) | 2023.01.18 |
[Python] 폰켓몬 - 프로그래머스 (0) | 2023.01.18 |
Comments