티스토리 뷰

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

문제 설명

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

제한사항

  • n은 1 이상 1,000 이하입니다.

 

입출력 예


문제 풀이

삼각형을 볼 때 회전하는 방향은 항상 정해져있다.

아래로 내려가는 방향 -> 오른쪽으로 가는 방향 -> 위로 올라가는 방향 -> 아래로 내려가는 방향....

위 순서로 반복해서 진행된다.

 

n이 증가할 때 마다 삼각형이 회전하는 곳의 숫자를 살펴보면

n = 2 -> 2
n = 3 -> 3, 5
n = 4 -> 4, 7, 9
n = 5 -> 5, 9, 12, 14
n = 6 -> 6, 11, 15, 18, 20
 
첫 번째로 회전하는 지점은 숫자가 n인 경우에 회전한다.
이후에는 n-1 만큼 증가한 숫자에서 회전을 하고 그 이후 회전해야하는 숫자를 만난 경우는 n-2 만큼 증가한 숫자에서 회전해야 한다. 위와 같이 반복하면서 증가하다가 n이 1인경우 마지막 숫자를 적게 된다.
 
def solution(n):
    answer = []

    snail_row = [[0 for j in range(1, i+1)] for i in range(1, n+1)]
    
    cnt = 0
    for i in range(1,n+1):
        cnt += i
    
    x, y = 0, 0
    flag = 0
    next_dir = n-1
    for num in range(1,cnt+1):
        snail_row[x][y] = num
        
        if flag == 0: # 왼쪽 아래로 진행
            x += 1

            if num == next_dir: # 방향을 바꿔야되는 경우
                flag = 1
                n -= 1
                next_dir = next_dir + n


        elif flag == 1: # 오른쪽으로 진행
            y += 1

            if num == next_dir:
                flag = 2
                n -= 1
                next_dir = next_dir + n

        
        elif flag == 2: # 왼쪽 상단으로 진행
            x -= 1
            y -= 1

            if num == next_dir:
                flag = 0
                n -= 1
                next_dir = next_dir + n

        else:
            continue
           
    for row in snail_row:
        for data in row:
            answer.append(data)
        
    return answer


print(solution(5))

# n = 2 -> 2
# n = 3 -> 3, 5
# n = 4 -> 4, 7, 9
# n = 5 -> 5, 9, 12, 14
# n = 6 -> 6, 11, 15, 18, 20
 

 

댓글