2023-04-19 삼각 달팽이

생각한 부분

문제에서 요구하는 반시계 방향의 삼각 달팽이 모양을 어떻게 만들 수 있을까? 위에서부터 순서대로 리스트에 기록한다고 하면

1
2
3
4
1
2  9
3 10 8
4  5 6 7

와 같은 식으로 표현하는 방법이 먼저 생각이 난다.

그럼 반시계 방향으로 회전하는 부분은 리스트의 범위를 벗어나거나 이미 배열에 초기값 0이 아닌 다른 값이 기록되어 있는 경우 방향을 전환하도록 구현하면 될 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def solution(n):
    """
    1
    2  9
    3 10 8
    4  5 6 7
    """
    
    dx, dy = [1, 0, -1], [0, 1, -1]
    arr = [[0] * n for _ in range(n)]
    
    start = 1
    x, y = 0, 0
    d = 0
    last = n * (n+1) // 2
    while start <= last:
        arr[x][y] = start
        start += 1
        nx, ny = x + dx[d], y + dy[d]
        if nx < 0 or nx >= n or ny < 0 or ny >= n or arr[nx][ny] != 0:
            d = (d+1) % 3
            nx, ny = x + dx[d], y + dy[d]
        x, y = nx, ny
        
    ans = []
    for i in range(n):
        for j in range(i+1):
            ans.append(arr[i][j])
    
    return ans

comments powered by Disqus