eaz_coding

[Programmers] 삼각 달팽이 본문

eaz_algorithm

[Programmers] 삼각 달팽이

eaz_silver 2024. 1. 3. 00:10

문제

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

 


제한사항

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

입출력 예

 


풀이

이전에 풀었던 행렬 테두리 회전하기 문제 덕분에 좀 빠르게 풀 수 있었다.

 

풀이 방식은 먼저, 규칙을 찾기

1. 채워야 하는 마지막 숫자는 1부터 n까지의 합. (이거 n*(n+1)/2로 구하면 빠를텐데 공식 다까먹음;; 진짜 똥멍청이)

2. 방향은 아래, 오른쪽, 위를 반복해서 이동함.

3. 이동 방향을 바꿀 때마다, 이동 간격이 1씩 작아짐.

 

대략적으로 이런 규칙을 찾아서 이를 구현했다.

하나 배운 것은 2차원 배열을 1차원으로 바꾸는 쉬운 방법,

sum(arr, []) 2차원 배열과 1차원 배열의 합은 1차원으로 나온다.

 

def solution(n):
    arr = [[0] * (i+1) for i in range(n)]
    
    i, j = -1, 0
    lst = [[1,0], [0,1], [-1,-1]]
    d=0
    last = sum(list(k for k in range(1, n+1)))
    
    cnt = 1
    while cnt <= last:
        
        for _ in range(n):
            i += lst[d][0]
            j += lst[d][1]
            arr[i][j] = cnt
            cnt += 1
            
        n-=1
        if d < 2:
            d+=1
        else:
            d=0
            
    answer = sum(arr, [])
    return answer