❗달팽이 배열
나선형으로 배열을 채우는 패턴으로 배열을 돌면서 값을 순서대로 채우는 배열을 말한다. 일반적으론 왼쪽 상단에서 시작해서 안쪽으로 채우는 경우가 많고, 변형으로 중앙에서 시작해서 바깥쪽으로 나가는 방식도 있다
❗좌측 상단에서 시작
n, m = map(int, input().split(" "))
graph = [[0 for _ in range(m)] for _ in range(n)]
visited = [[0 for _ in range(m)] for _ in range(n)]
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
d = 0
x = 0
y = 0
graph[x][y] = 1
visited[x][y] = 1
for i in range(2, n * m+1):
nx = x + dx[d]
ny = y + dy[d]
if not (0 <= nx and nx < n and 0 <= ny and ny < m and not visited[nx][ny]):
d = (d + 1) % 4
nx = x + dx[d]
ny = y + dy[d]
x = nx
y = ny
graph[x][y] = i
visited[x][y] = 1
for row in graph:
print(*row)
- 시작점은 0, 0으로 d도 0으로 설정
- graph와 visited에 시작점 설정
- 채워넣을 값(i)을 for문 실행
- nx와 ny가 범위 안에 없거나 방문한 경우에 방향을 수정하고 nx, ny를 다시 설정
- x와 y를 nx와 ny로 업데이트
- graph와 visited에 x와 y위치 값 업데이트
❗중앙에서 시작
n = int(input())
graph = [[0 for _ in range(n)] for _ in range(n)]
visited = [[0 for _ in range(n)] for _ in range(n)]
x = n // 2
y = n // 2
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
d = 0
dist = 1
graph[x][y] = 1
num = 2
while num <= n*n:
# 같은 거리 2번
for _ in range(2):
for _ in range(dist):
nx = x + dx[d]
ny = y + dy[d]
if 0<= nx and nx < n and 0<= ny and ny < n and not visited[nx][ny]:
x = nx
y = ny
graph[x][y] = num
num += 1
visited[x][y] = 1
d = (d+1)%4
dist += 1
for row in graph:
print(*row)
- 시작점은 범위 크기 // 2, d(방향)은 0, dist(거리)는 1로 설정
- num은 2부터 시작하며 n*n까지만 실행할 수 있게 하기
- 같은 크기의 거리를 2번씩 실행
- 그 안에서 dist만큼 값을 채워나가는 방식
- nx, ny를 설정하고 범위 내에 있으며 방문하지 않은 경우만 x, y로 업데이트하고 graph의 값을 num으로 채움
- 다음 순서를 위해 num+1
- 거리만큼 실행 후엔 방향 변경
- 2번 같은 방향으로 실행하면 dist+1
728x90
반응형
'🔻Computer Science > Algorithm' 카테고리의 다른 글
[Algorithm] 0-1 배낭 문제 이론 + 예제 (0) | 2024.10.31 |
---|---|
[Algorithm] Dijkstra(다익스트라) 이론 + 예제 (0) | 2024.10.30 |
[Algorithm] 분할정복 이론 + 예제 (0) | 2024.09.19 |
[Algorithm] Recursion 이론 + 예제 (0) | 2024.09.04 |
[Algorithm] 우선순위 큐 이론 + heapq 사용법 (0) | 2024.08.09 |