알고리즘/Programmers

[Programmers] 삼각 달팽이 (월간 코드 챌린지 시즌1 - Level2, Python3)

 

 

코딩테스트 연습 - 삼각 달팽이

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]

programmers.co.kr

 

문제 설명

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

 

 

제한 사항

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

 

 

입출력 예

n result
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]

 

 

힌트

더보기

초심자에게는 약간 어려울 수도 있는 구현문제이다.

어렵게 생각하면 어렵게 보이는 법.

보이는 그림 그대로 리스트를 만들어서 숫자가 채워지는 규칙을 찾아 구현해보자.

 

 

풀이

더보기

먼저 번호가 채워지는 규칙성을 먼저 파악해보자

아래 그림과 같이 왼쪽 -> 아래쪽 -> 오른쪽 변 순서대로 n, n - 1, n - 2, ..... 1개씩 순서대로 채워지는 것을 확인할 수 있다.

 

 

def solution(n):
    triangle_list = [[0] * i for i in range(1, n + 1)]
    
    number = 1
    flag = 0    # 왼쪽 0, 아래쪽 1, 오른쪽 2
    row, col = -1, 0
    
    for count in range(n, 0, -1):
        if flag == 0:
            for _ in range(count):
                row += 1
                triangle_list[row][col] = number
                number += 1
        
        elif flag == 1:
            for _ in range(count):
                col += 1
                triangle_list[row][col] = number
                number += 1
        
        else:
            for _ in range(count):
                row -= 1
                col -= 1
                triangle_list[row][col] = number
                number += 1
        
        flag = (flag + 1) % 3
    
    answer = []
    
    for t_list in triangle_list:
        answer.extend(t_list)
    
    return answer