[프로그래머스/Lv.2] 삼각 달팽이 | 파이썬

문제

https://school.programmers.co.kr/learn/courses/30/lessons/68645

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • n은 1 이상 1,000 이하입니다.

 

입출력 예

 

나의 풀이

def solution(n):
    snail = [[0] * i for i in range(1, n + 1)]
    moves = [(1, 0), (0, 1), (-1, -1)]
    
    turns = [0]
    for i in range(n, 0, -1):
        turns.append(turns[-1] + i)
    
    r, c, j = -1, 0, 0
    for i in range(1, n + 1):
        dr, dc = moves[j]
        
        for num in range(turns[i - 1] + 1, turns[i] + 1):  
            r += dr
            c += dc
            snail[r][c] = num
            
        j = (j + 1) % 3
    
    answer = []
    for arr in snail:
        answer += arr
        
    return answer

`moves`에 아래, 오른쪽, 위로 움직이는 세 가지 이동 방향을 순서대로 저장했다.

`turns`에는 한 번 꺾을 때마다 이동 횟수가 `n, n-1, n-2, …`씩 줄어드는 규칙을 이용해서

누적합 형태로 꺾이는 시점을 미리 저장했다.

 

`turns`를 기준으로 각 구간이 끝날 때마다 `moves`의 방향을 전환하며

달팽이 모양으로 숫자를 채워나가도록 구현했다.