정수 n이 주어질 때 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 반환하는 함수 작성
def solution(n):
arr = [[0] * i for i in range(1, n+1)] # 주어진 n에 따른 직각삼각형 생성
dirs = [(1, 0), (0, 1), (-1, -1)] # 방향 집합(아래, 오른쪽, 왼쪽위)
turn = 0 # 방향을 돌려줄 지표
y, x = 0, 0 # 시작 좌표
i = 1
end_num = sum(i for i in range(1, n+1)) # 직각삼각형 내부의 칸 수
while i <= end_num:
arr[y][x] = i
i += 1
dy, dx = dirs[turn]
ny = y + dy
nx = x + dx
# 다음 칸이 0부터 n 범위 내에 위치하고 값이 0일 경우 y, x값 변경
if 0 <= ny < n and 0 <= nx < n and arr[ny][nx] == 0:
y, x = ny, nx
# 범위를 벗어나거나 값이 0이 아닐 경우 방향 변경
else:
turn = (turn + 1) % 3
dy, dx = dirs[turn]
y += dy
x += dx
ans = []
for row in arr:
for item in row:
ans.append(item)
return ans
arr
생성dirs
생성[1]
[2, 9]
[3, 10, 8]
[4, 5, 6, 7]
[1]
[2, 12]
[3, 13, 11]
[4, 14, 15, 10]
[5, 6, 7, 8, 9]
[1]
[2, 15]
[3, 16, 14]
[4, 17, 21, 13]
[5, 18, 19, 20, 12]
[6, 7, 8, 9, 10 ,11]
turns
와 최초 시작점 y
, x
및 배열에 넣을 숫자 i
와 생성된 전체 칸의 수이자 마지막 수인 end_num
설정while
Loop으로 i
가 end_num
보다 작거나 같을 때 그래프 탐색을 반복