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

최더디·2021년 1월 24일
0
post-thumbnail

📃 문제 설명

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

examples.png

제한사항

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

입출력 예

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]

💻 문제 풀이

def solution(n):
    # 값이 들어갈 삼각형을 이중배열로 생성
    triangle = [[0 for j in range(i)] for i in range(1,n+1)]
    
    num = 1
    x,y = 0,0
    direction = "down"                      # 첫 방향은 아래로 움직임

    for i in range(n):                  
        if direction == "down":             # 방향이 아래일 때는 x값을 1씩 더해주면서 값을 넣는다.
            for j in range(i, n):
                triangle[x][y] = num
                x += 1                      
                num += 1                    
            x -= 1                          # x를 -1, y를 +1 해줌으로써 좌표를 설정    
            y += 1
            direction = "right"             # 아래로 움직인 후에는 오른쪽으로 이동
        
        elif direction == "right":          # 방향이 오른쪽일 때는 y값을 1씩 더해주면서 값을 넣는다.
            for j in range(i, n):
                triangle[x][y] = num
                y += 1
                num += 1
            x -= 1                          # x를 -1, y를 -2 해줌으로써 좌표를 설정
            y -= 2
            direction = "up"                # 오른쪽으로 움직인 후에는 대각선으로 이동
        
        elif direction == "up":             # 방향이 위로올라갈때는(대각선) x, y값을 1씩 빼면서 값을 넣는다.
            for j in range(i, n):
                triangle[x][y] = num
                x -= 1
                y -= 1
                num += 1
            x += 2                          # x를 +2, y를 +1 해줌으로써 좌표를 설정
            y += 1
            direction = "down"              # 대각선이동 후 아래쪽으로 이동
    
    answer = []
    for i in range(len(triangle)):          # triangle 이중배열을 더해주면서 하나의 배열로 생성
        answer += triangle[i]

    return answer

중요 포인트

  • 숫자가 채워지는 순서 : 아래(down) → 오른쪽(right) → 위쪽(대각선, up)
  • down일 때는 x값이 +1 증가하면서 값이 넣어진다.
  • right일 때는 y값이 +1 증가하면서 값이 넣어진다.
  • up일 때는 x,y 값이 -1 감소하면서 값이 넣어진다.
  • 한 라인에 값이 넣어질 때의 반복 횟수는 n 값에서 -1 감소하게 된다.

n=7 일 때 순서

"""
triangle[x][y]
"""
triangle[0][0] = 1		# x값이 +1
triangle[1][0] = 2
triangle[2][0] = 3
triangle[3][0] = 4
triangle[4][0] = 5
triangle[5][0] = 6
triangle[6][0] = 7

triangle[6][1] = 8		# y값이 +1
triangle[6][2] = 9
triangle[6][3] = 10
triangle[6][4] = 11
triangle[6][5] = 12
triangle[6][6] = 13

triangle[5][5] = 14		# x,y 값이 -1
triangle[4][4] = 15
triangle[3][3] = 16
triangle[2][2] = 17
triangle[1][1] = 18
------------------------------

triangle[2][1] = 19		# x값이 +1
triangle[3][1] = 20
triangle[4][1] = 21
triangle[5][1] = 22

triangle[5][2] = 23		# y값이 +1
triangle[5][3] = 24
triangle[5][4] = 25

triangle[4][3] = 26		# x,y 값이 -1
triangle[3][2] = 27
-----------------------------

triangle[4][2] = 28		# x값이 +1

다른 사람 코드

정말 간단하게 코드를 작성하셨다.

def solution(n):
    triangle = [[0 for j in range(i)] for i in range(1,n+1)]
    
    num = 1
    x,y = -1,0

    for i in range(n):
        for j in range(i,n):
            if i%3 == 0:
                x += 1
            elif i%3 == 1:
                y += 1
            elif i%3 == 2:
                x -= 1
                y -= 1
            triangle[x][y] = num
            num += 1
    
    answer = []
    for i in range(len(triangle)):
        answer += triangle[i]
    
    return answer
profile
focus on why

0개의 댓글