Practice makes perfect!

[프로그래머스] 삼각달팽이 - python 본문

Coding test/구현

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

na0dev 2021. 6. 18. 15:00

문제


정수 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]
def solution(n):
    a = [[0]*i for i in range(1,n+1)] # 직각 삼각형을 표현할 리스트 생성
    dx = [1,0,-1] # 아래, 오른쪽, 대각선
    dy = [0,1,-1]
    d = 0
    cnt = 1 # 달팽이 수
    x,y = 0,0 # 현재 위치
    s = sum(i for i in range(1,n+1)) # 피라미드에 들어갈 최대 숫자
    
    # 달팽이 수를 다 채울 때 까지
    while(cnt <= s):
        a[x][y] = cnt # 달팽이 채우기
        cnt += 1 # 달팽이 수 증가
        nx = x + dx[d] # 다음 움직일 위치
        ny = y + dy[d]
        # 직각삼각형을 벗어나지 않으며, 아직 방문하지 않은 경우
        if 0<=nx<n and 0<=ny<n and a[nx][ny]==0:
        	# 위치 이동
            x = nx
            y = ny
        else:
            d = (d+1)%3 # 방향 회전 (0~2의 값만 반복되야하므로 %(모줄러)연산 사용)
            x += dx[d]
            y += dy[d]
    return sum(a,[])

* 피라미드 모양을 왼쪽으로 다 밀어붙여서 직각 삼각형 형태로 만드는 것이 포인트

* 이동하는 방향(반시계)이 정해져 있으므로 dx, dy를 이용해 방향을 회전할 수 있도록 함.

반응형
Comments