Algorithm & Data Structure/Programmers

[Programmers]Python_삼각 달팽이

ju_young 2021. 1. 25. 20:18
728x90
문제

 

문제 설명

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

Programmers

 

제한사항
  • n은 1 이상 1,000 이하입니다.

 

코드
from itertools import chain #다중 행렬 -> 일차 행렬
def solution(n):
    data = {"D" : (1, 0), "R" : (0, 1), "U" : (-1, -1)} #방향별 이동 정보
    
    figure = [[0] * i for i in range(1, n + 1)] #n만큼 삼각달팽이 모양을 생성
    
    row, col = -1, 0 #0, 0부터 시작하기위해 row값을 -1부터 정의
    number = 1 #숫자 1부터 시작
    
    for i in range(n): #삼각달팽이 한 변
        for _ in range(i, n): #한 변당 숫자 개수
            #안쪽으로 꺽일때마다 방향이 바뀜
            if i % 3 == 0:
                direction = "D"
            elif i % 3 == 1:
                direction = "R"
            elif i % 3 == 2:
                direction = "U"
			
            #data에 정의한 방향별 이동
            row += data[direction][0]
            col += data[direction][1]
			
            #현재 위치에 number정의
            figure[row][col] = number

            number += 1 #다음 number
    return list(chain(*figure)) #figure를 unpack하여 list로 정의

 

진행 과정

 

예제 #1

n = 4

 

월간챌린지에 나온 문제인데... 이때 감을 못잡아서 풀지를 못했다...

 

삼각달팽이는 총 3가지 방향으로 숫자가 증가하는 것이 Key이다.

 

해당 예제는 처음 한 변에 있는 숫자의 개수는 4이고 차례대로 3, 2, 1으로 점점 줄어든다. 이것은 "for i in range(n): for _ in range(i ,n):"으로 구현되었다.

 

i에 따라서 방향을 정했는데 방향은 아래, 위, 오른쪽으로 총 3가지이므로 i % 3의 결과로 구분하였다. 그리고 이 결과로 방향에 따른 row, col 값에 더할 값들을 미리 정의해두고 이동해가며 숫자들을 집어넣었다.

 

i % 3 = 0이면 아래쪽으로 이동하므로 row값을 + 1

i % 3 = 1이면 오른쪽으로 이동하므로 col값을 + 1

i % 3 = 2이면 위쪽으로 이동하면서 안쪽으로 들어가기때문에 row, col 값을 각각 -1

 

모든 숫자들을 넣게되면 "[[1], [2, 9], [3, 10, 8], [4, 5, 6, 7]]"과같이 다중 행렬로 결과가 나오는데 이것을 itertools의 chain 메소드를 사용하여 unpacking을 한다.

 

chain(*figure)을 하면 1, 2, 9, 3, 10, 8, 4, 5, 6, 7이 되고 이것을 그대로 return값으로 지정하게되면 안된다. 이는 그냥 unpacking한 값이고 list가 아니기때문에 마지막에 list로 반환해주어야한다.

 

코드 진행은 다음과 같다.

 

1) direction = D
2) figure = [[1], [0, 0], [0, 0, 0], [0, 0, 0, 0]]


3) direction = D
4) figure = [[1], [2, 0], [0, 0, 0], [0, 0, 0, 0]]


5) direction = D
6) figure = [[1], [2, 0], [3, 0, 0], [0, 0, 0, 0]]


7) direction = D
8) figure = [[1], [2, 0], [3, 0, 0], [4, 0, 0, 0]]


9) direction = R
10) figure = [[1], [2, 0], [3, 0, 0], [4, 5, 0, 0]]


11) direction = R
12) figure = [[1], [2, 0], [3, 0, 0], [4, 5, 6, 0]]


13) direction = R
14) figure = [[1], [2, 0], [3, 0, 0], [4, 5, 6, 7]]


15) direction = U
16) figure = [[1], [2, 0], [3, 0, 8], [4, 5, 6, 7]]


17) direction = U
18) figure = [[1], [2, 9], [3, 0, 8], [4, 5, 6, 7]]


19) direction = D
20) figure = [[1], [2, 9], [3, 10, 8], [4, 5, 6, 7]]

 

21) result = [1,2,9,3,10,8,4,5,6,7]

728x90