[python] 삼각 달팽이

JunHyeok Oh·2021년 6월 28일

문제

문제 설명

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

(문제, 그림 출처 : 프로그래머스 - 삼각달팽이 )

풀이

나의 풀이

def solution(n):
    row = []
    col = []
    # 좌표 구하기 ( 행렬화 )
    rcount = 0
    ccount = 1
    cnt = 1001
    for i in range(n,0,-1):
        cnt -= 1
        for j in range(i):
            if cnt % 3 ==0 :
                row.append(rcount)
                ccount += 1
                col.append(ccount)
            elif cnt % 3 == 1:
                rcount += 1
                row.append(rcount)
                col.append(ccount)
            else :
                rcount -= 1
                row.append(rcount)
                ccount -= 1
                col.append(ccount)
    
    loc = [[a,b] for a,b in zip(row,col)]
    # 배치
    ans = 0
    result = [[0]*(res+1) for res in range(n)]
    for num in loc:
        ans += 1
        result[num[0]-1][num[1]-1]= ans
    # 한개의 리스트에 담기
    answer = [fin for f in result for fin in f]
    return answer

풀이과정

  • 피라미드 모양의 삼각형 그림을 행렬이라고 생각하고 문제를 풀이했다.
  • n=4 일때 삼각 달팽이를 행렬과 같이 표현하면 위의 표와 같다.
  • 여기서 숫자 1~10의 숫자 쌓기 과정이 필요한데, 삼각달팽이의 숫자 쌓기 과정이 삼각형의 모양에 반시계방향으로 숫자를 n , n-1 , n-2, ...1개 씩 쌓고 있음을 이용했다.
  • 그러므로 for문으로 n개부터 1개씩 쌓아가는데, 처음 n개를 쌓을 때는 숫자를 한 행씩 더하고 열은 유지시키면서 리스트에 넣었고 , 그 다음 n-1개는 열만 한 열씩 더하고, 다음 n-2 개는 열과 행을 1개씩 감소시키면서 쌓았다.
  • 위 3개의 과정을 for문이 1에 닿을 때 까지 반복했다.
  • 리스트에 편히 넣기위해 주어진 n에 해당하는 삼각 달팽이에 맞는 행과 열을 미리 loc 리스트에 구하고 , 그 loc 리스트를 for문을 돌리며 result 리스트에 값을 넣었다.

테스트 케이스

  • 위에 있는 그림에 있는 숫자들을 리스트화 시킨 것이다.
nresult
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]
profile
Univ of Seoul , Statistics

0개의 댓글