[알고리즘] 프로그래머스 삼각 달팽이

진실·2022년 10월 16일
0

알고리즘

목록 보기
1/22
post-thumbnail
post-custom-banner

문제 설명

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

제한 사항

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

입출력 예

nresult
4[1,2,9,3,10,8,4,5,6,7]
5[1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
6[1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 문제 예시와 같습니다.

풀이


n=6인 경우의 예시입니다.
처음 포인터를 (0, 0)에서 시작해서 (1, 0), ..., (5, 0)까지 증가시켜 줍니다. 그 다음에는 (5, 1), (5, 2), ... (5, 5)로 포인터를 이동시켜줍니다. 이렇게 세로, 가로, 대각선으로 포인터를 이동해 주면서 2차원 배열을 만들어 주면 됩니다.

가만 보면 한번에 찍히는 숫자 개수가 n개, n-1개, ..., 1개 이렇게 줄어듭니다. 이렇게 한 번에 찍히는 숫자 개수가 0보다 클 때까지 세로, 가로, 대각선으로 찍는 행위를 반복하면 됩니다.

코드

def solution(n):
    answer = []
    
    triangle = [[0 for _ in range(n)] for _ in range(n)]
    
    i, j = -1, 0
    m = n
    num = 1
    
    while m > 0 : 
        i += 1
        
        # 세로
        for _ in range(m) : 
            triangle[i][j] = num
            i += 1
            num += 1
        m -= 1
        
        if m == 0 : 
            break
        
        i -= 1
        j += 1
        
        # 가로
        for _ in range(m) : 
            triangle[i][j] = num
            num += 1
            j += 1
            
        m -= 1
        j -= 1
        
        if m == 0 : 
            break
            
        i -= 1
        j -= 1
        
        # 대각선
        for _ in range(m) : 
            triangle[i][j] = num
            num += 1
            i -= 1
            j -= 1
        i += 1
        j += 1
        m -= 1
    
    # flattening
    for i in range(n) : 
        answer.extend(triangle[i][:i+1])
        
    return answer

의문이 드는 점, 개선해야할 점은 댓글로 남겨주세요.
감사합니다 😽

profile
반갑습니다.
post-custom-banner

0개의 댓글