Data Structure & Algorithm
구현 예제1: n * n 리스트에 나선형으로 값 채우기
낙타선생
2021. 4. 6. 09:24
반응형
N x N size의 2차원 리스트가 있습니다. 시작 인덱스는 (0, 0)이며 그 값은 1입니다. 처음 진행 방향은 오른쪽이며 진행 방향을 따라 나선형으로 돌면서 값을 1씩 증가시키며 각 인덱스를 채운 리스트를 만들어주세요.
입력)
4
출력)
[[1, 2, 3, 4],[12, 13, 14, 5],[11, 16, 17, 6],[10, 9, 8, 7]]
위를 구현한 소스코드는 다음과 같습니다.
import sys
n = int(sys.stdin.readline().rstrip())
spiral_list = [[0] * n for _ in range(n)]
# limit points of each direction
lp_left_side = 0
lp_right_side = n - 1
lp_up_side = 1 # i == 0 부터 순회 하므로 up의 초기 값은 1이 된다.
lp_down_side = n - 1
# 0: right, 1:down, 2:left, 3:up
di = [0, 1, 0, -1]
dj = [1, 0, -1, 0]
direction = 0 # initialize to right
count = 1
i = 0
j = 0
while count <= n * n:
spiral_list[i][j] = count
count += 1
direction %= 4
# 진행방향의 끝에 도달하면 방향 전환
if direction == 0 and j == lp_right_side:
direction = (direction + 1) % 4
lp_right_side -= 1
elif direction == 1 and i == lp_down_side:
direction = (direction + 1) % 4
lp_down_side -= 1
elif direction == 2 and j == lp_left_side:
direction = (direction + 1) % 4
lp_left_side += 1
elif direction == 3 and i == lp_up_side:
direction = (direction + 1) % 4
lp_up_side += 1
# 다음 방문할 리스트 인덱스 설정
i += di[direction]
j += dj[direction]
for e in spiral_list:
print(e)