[프로그래머스-Python] 삼각 달팽이

Hesoyam·2020년 12월 14일
0

내용

정수 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]

사용 코드

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]
  • 삼각달팽이는 반시계 방향으로 숫자가 1부터 채워지는데 이걸 파이썬 코드로 보면 왼쪽의 피라미드 모양이 아닌 오른쪽과 같이 아래로 내려갈수록 값이 커지는 모양으로 나타난다. 즉, x와 y의 값이 점차 증가하는 직각 삼각형 모양으로 생각할 수 있다.

  • 이제 저 모양을 코드로 그린다고 생각해보면 된다. (0,0)을 시작으로 생각하면 (1,0), (2,0) ... 아래로 내려가는 모양이 나타난다. 이제 오른쪽(0,1)으로 이동하고 그 다음 대각선으로 (-1,-1)만큼 움직이면 삼각 달팽이가 완성이 된다.
  1. 이런 형태를 잘보면 아래, 오른쪽, 위 다시 아래, 오른쪽, 위... 이러한 형태의 반복이 계속된다. 방향을 알려주는 변수를 생성하고 n번 진행 후 방향이 변환하니 range(n)을 해당 변수에 초기화 시켜준다.

  2. 방향에 따른 방향은 아래, 오른쪽, 위 3가지 값의 반복이니 %3으로 어느 방향인지 알려준다.

  3. 삼각 달팽이는 n=k 부터 k-1, k-2, k-3... 번씩 그려지는 모양을 이루고 있다. ( 1->4,   5->7  8->9 ,  10 )
    따라서 점차 감소하는 반복을 사용한다.

  4. 전체 방향을 안 후 방향에 따라서 숫자를 배치해야 하므로 전체 반복 [for i in range(n) ] 안에 range(i,n)과 같은 형태에 반복을 사용했다.

  5. 2차원 리스트를 1차원으로 합쳐야 하므로 itertools의 chain을 사용하여 1차원 리스트로 만들어 주었다.


profile
거북이가 되고 싶은 자라

0개의 댓글