이 문제에서 숫자는 각각 아래, 오른쪽, 대각선을 향해 증가하고 삼각형 하나를 그렸을 때 다시 아래로 움직이면서 증가한다. 이것이 무한히 반복되고 최종 숫자가 1~N까지의 합인 N X (N + 1) / 2 일 때 종료된다.
def solution(n):
answer = []
arr = [[0] * i for i in range(1, n + 1)]
x, y = -1, 0 # 현재 좌표
dx = [1, 0, -1] # 각각 아래, 오른쪽, 대각선으로 이동
dy = [0, 1, -1]
direct = 0 # 방향
now = 0 # 현재 숫자
while now < n * (n + 1) // 2:
nx = x + dx[direct]
ny = y + dy[direct]
# 끝에 도달 혹은 숫자가 있음 -> 방향 전환
if direct == 0 and (nx >= n or arr[nx][ny] > 0):
direct = 1
continue
elif direct == 1 and (ny >= n or arr[nx][ny] > 0):
direct = 2
continue
elif direct == 2 and arr[nx][ny] > 0:
direct = 0
continue
now += 1
arr[nx][ny] = now
x = nx
y = ny
for x in arr:
answer.extend(x)
return answer