문제
문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- 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]
'Algorithm & Data Structure > Programmers' 카테고리의 다른 글
[Programmers]Python_가장 큰 수 (0) | 2021.01.28 |
---|---|
[Programmers]Python_큰 수 만들기 (0) | 2021.01.27 |
[Programmers]Python_스킬트리 (0) | 2021.01.21 |
[programmers]Python_다리를 지나는 트럭 (0) | 2021.01.20 |
[Programmers]Python_기능개발 (0) | 2021.01.19 |