상,하,좌,우로 이동하는 케이스에 따라서, 인덱스 i,j가 각각 고정/증가/감소 세 가지 경우의 형태로 움직이기 때문에, 케이스 분류가 꼭 필요했다.
그 과정에서 핵심은,
경계값을 동적으로 조정하여 위쪽, 아래쪽, 왼쪽, 오른쪽의 경계를 좁혀 나가면서 숫자를 배열에 나선형으로 채우는 것이었다.
경계 설정 (top, bottom, left, right):
top: 현재 배열의 위쪽 경계.
bottom: 현재 배열의 아래쪽 경계.
left: 현재 배열의 왼쪽 경계.
right: 현재 배열의 오른쪽 경계.
방향 설정 및 경계 조정
오른쪽 이동 (right):
for j in range(left, right + 1) 루프를 통해 왼쪽=> 오른쪽으로 이동하면서 숫자를 배열에 채운다.
오른쪽으로 이동한 후에는 위쪽 경계 (top)를 한 칸 아래로 이동한다. 그리고 now 값을 top과 right로 업데이트해 다음 위치를 설정했다.
이후 방향을 "down"으로 변경
아래로 이동 (down):
for i in range(top, bottom + 1) 루프를 통해 위=> 아래로 이동하면서 숫자를 배열에 채운다.
아래로 이동한 후에는 오른쪽 경계 (right)를 한 칸 왼쪽으로 이동한다. 그리고 now 값을 bottom과 right로 업데이트했다.
이후 방향을 "left"로 변경.
왼쪽 이동 (left):
for j in range(right, left - 1, -1)루프를 통해 오른쪽=>왼쪽으로 이동하면서 숫자를 배열에 채운다.
왼쪽으로 이동한 후에는 아래쪽 경계 (bottom)을 한 칸 위로 이동한다. 그리고 now 값을 bottom과 left로 업데이트
이후 방향을 "up"으로 변경합니다.
위로 이동 (up):
for i in range(bottom, top - 1, -1) 루프를 통해 아래=> 위로 이동하면서 숫자를 배열에 채운다.
위로 이동한 후에는 왼쪽 경계 (left)를 한 칸 오른쪽으로 이동한다. 그리고 now 값을 top과 left로 업데이트.
이후 방향을 "right"로 변경하여 다시 오른쪽으로 이동하는 사이클을 반복.
💫코드
def solution(n):
tmp_map = [[0] * n for _ in range(n)] # n x n 크기의 배열 생성
number = 1 # 0이 아닌 1부터 시작
direction = "right"
now = (0, 0) # 시작 좌표
top, bottom = 0, n - 1 # 위쪽과 아래쪽 경계
left, right = 0, n - 1 # 왼쪽과 오른쪽 경계
while number <= n * n: # 숫자가 n^2까지 반복
if direction == "right":
for j in range(left,right+1):
if tmp_map[now[0]][j] !=0:
break
tmp_map[now[0]][j] = number
number+=1
top += 1 # 위쪽 경계를 한 칸 아래로 내림
now = (top, right) # 현재 위치 업데이트
direction = "down"
elif direction == "down":
for i in range(top,bottom+1):
if tmp_map[i][now[1]] !=0:
break
tmp_map[i][now[1]] = number
number+=1
right -= 1 # 위쪽 경계를 한 칸 아래로 내림
now = (bottom, right) # 현재 위치 업데이트
direction = "left"
elif direction == "left":
for j in range(right,-1,-1):
if tmp_map[now[0]][j] !=0:
break
tmp_map[now[0]][j] = number
number+=1
bottom -= 1 # 위쪽 경계를 한 칸 아래로 내림
now = (bottom, left) # 현재 위치 업데이트
direction = "up"
elif direction == "up":
for i in range(bottom,-1,-1):
if tmp_map[i][now[1]] !=0:
break
tmp_map[i][now[1]] = number
number+=1
left += 1 # 위쪽 경계를 한 칸 아래로 내림
now = (top, left) # 현재 위치 업데이트
direction = "right"
# 결과 출력
for row in tmp_map:
print(row)
return tmp_map