기록

프로그래머스_삼각 달팽이 본문

코딩테스트/python

프로그래머스_삼각 달팽이

youngyin 2021. 5. 27. 21:08

문제

https://programmers.co.kr/learn/courses/30/lessons/68645#

 

코딩테스트 연습 - 삼각 달팽이

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]

programmers.co.kr

풀이

1. 삼각형 형태의 arr 배열을 생성한다.

2. int((n-1)/3)+1번 회전한다.

[1]
[2, 21]
[3, 22, 20]
[4, 23, 33, 19]
[5, 24, 34, 32, 18]
[6, 25, 35, 36, 31, 17]
[7, 26, 27, 28, 29, 30, 16]
[8, 9, 10, 11, 12, 13, 14, 15]

삼각형을 직접 그려보면,

n이 8인 경우 3번 회전한다.

n이 7인 경우 3번 회전한다.

n이 6인 경우 2번 회전한다.

n이 5인 경우 2번 회전한다.

n이 4인 경우 2번 회전한다.

n이 3인 경우 1번 회전한다.

n이 2인 경우 1번 회전한다.

n이 1인 경우 1번 회전한다.

 

2-1. ↓방향으로 step만큼 이동하면서 arr을 채운다.

2-2. → 방향으로 step만큼 이동하면서 arr을 채운다.

2-3. ↖ 방향으로 step만큼 이동하면서 arr을 채운다.

2-4. step을 3만큼 줄인다.

 

n=7일 때 arr은 다음과 같이 변경된다.

  i = 0, step = 6 i = 1 step = 3 i = 2, step = 1
↓방향 [1]
[2, 1]
[3, 1, 1]
[4, 1, 1, 1]
[5, 1, 1, 1, 1]
[6, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1]
[1]
[2, 18]
[3, 19, 17]
[4, 20, 1, 16]
[5, 21, 1, 1, 15]
[6, 1, 1, 1, 1, 14]
[7, 8, 9, 10, 11, 12, 13]
[1]
[2, 18]
[3, 19, 17]
[4, 20, 27, 16]
[5, 21, 28, 26, 15]
[6, 22, 23, 24, 25, 14]
[7, 8, 9, 10, 11, 12, 13]
→ 방향 [1]
[2, 1]
[3, 1, 1]
[4, 1, 1, 1]
[5, 1, 1, 1, 1]
[6, 1, 1, 1, 1, 1]
[7, 8, 9, 10, 11, 12, 1]
[1]
[2, 18]
[3, 19, 17]
[4, 20, 1, 16]
[5, 21, 1, 1, 15]
[6, 22, 23, 24, 1, 14]
[7, 8, 9, 10, 11, 12, 13]
[1]
[2, 18]
[3, 19, 17]
[4, 20, 27, 16]
[5, 21, 28, 26, 15]
[6, 22, 23, 24, 25, 14]
[7, 8, 9, 10, 11, 12, 13]
↖ 방향 [1]
[2, 18]
[3, 1, 17]
[4, 1, 1, 16]
[5, 1, 1, 1, 15]
[6, 1, 1, 1, 1, 14]
[7, 8, 9, 10, 11, 12, 13]
[1]
[2, 18]
[3, 19, 17]
[4, 20, 27, 16]
[5, 21, 1, 26, 15]
[6, 22, 23, 24, 25, 14]
[7, 8, 9, 10, 11, 12, 13]
[1]
[2, 18]
[3, 19, 17]
[4, 20, 27, 16]
[5, 21, 28, 26, 15]
[6, 22, 23, 24, 25, 14]
[7, 8, 9, 10, 11, 12, 13]

 

3. arr에 포함된 item을 순서대로 result에 넣어 반환한다. 

 

코드

def solution(n):    
    arr = [[1 for j in range(i+1)] for i in range(n)]    
    r, c = 0, 0
    num = 1
    step = n-1
    
    for _ in range(int((n-1)/3)+1) : 
        for dx, dy in [(1, 0), (0, 1), (-1, -1)] : 
            for i in range(step) : 
                if not (0<=r<len(arr)) : break
                if not (0<=c<len(arr[r])) : break
                if arr[r][c]>1 : break
                arr[r][c] = num
                r, c = r+dx, c+dy
                num += 1
        
        r, c = r+2, c+1
        step = max(step-3, 1)

    result = list()
    for item in arr : result.extend(item)
        
    return result
Comments