정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
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] |
import itertools
def snailNext(x,y,d_snail) :
if d_snail %3 ==0 : # 아래
x+=1
elif d_snail %3 ==1 : # 우측
y+=1
else :
x-=1
y -=1
return x,y
def solution(n):
tri_snail = [[0 for k in range(1,i+1)] for i in range(1,n+1) ]
direct_snail = range(n) # 0부터 n 까지의 리스트
x, y= -1, 0
idx = 1
for d_snail in direct_snail : # 0 일때 아래, 1일때 오른쪽, 2일때 위
for i in range(d_snail, n) :
x,y = snailNext(x,y,d_snail)
tri_snail[x][y]= idx
idx+=1
return list(itertools.chain(*tri_snail))
[1] [1]
[2][9] [2][9]
[3][10][8] -> [3][10][8]
[4][5][6][7] [4][5][6][7]
이런 형태를 잘보면 아래, 오른쪽, 위 다시 아래, 오른쪽, 위... 이러한 형태의 반복이 계속된다. 방향을 알려주는 변수를 생성하고 n번 진행 후 방향이 변환하니 range(n)을 해당 변수에 초기화 시켜준다.
방향에 따른 방향은 아래, 오른쪽, 위 3가지 값의 반복이니 %3으로 어느 방향인지 알려준다.
삼각 달팽이는 n=k 부터 k-1, k-2, k-3... 번씩 그려지는 모양을 이루고 있다. ( 1->4, 5->7 8->9 , 10 )
따라서 점차 감소하는 반복을 사용한다.
전체 방향을 안 후 방향에 따라서 숫자를 배치해야 하므로 전체 반복 [for i in range(n) ] 안에 range(i,n)과 같은 형태에 반복을 사용했다.
2차원 리스트를 1차원으로 합쳐야 하므로 itertools의 chain을 사용하여 1차원 리스트로 만들어 주었다.