728x90

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

# 조건

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

제한 사항

  • n은 1이상 1,000 이하

입출력 예

  • n = 4 인 경우 [1,2,9,3,10,8,4,5,6,7]

# 접근 방법

  • 주어진 입출력 예를 n x n 배열에 넣어 보자
    • 1 0 0 0 0
    • 2 12 0 0 0
    • 3 13 11 0 0
    • 4 14 15 10 0
    • 5 6 7 8 9
  • 숫자를 채우는 규칙이
    • 세로로 이동하다가 범위를 벗어나거나 이미 채워진 경우 가로로,
    • 가로로 이동하가 범위를 벗어나거나 채워진 경우 대각선 왼쪽위로,
    • 대각선 왼쪽위로 ( i-1, j-1 ) 이동하다가 범위 벗어나거나 채워진 경우 세로로 이동한다.
  • 즉, 해당 규칙을 while문을 돌리면서 변경시켜주면 된다.
    • pattern = [[1,0],[0,1],[-1,-1]] 을 범위가 벗어나거나 이미 채워진 경우 % 3을 통하여 다음 규칙으로 변경해준다.

def solution(n):
    answer = []
    # 1 0  0  0  0
    # 2 12 0  0  0
    # 3 13 11 0  0
    # 4 14 15 10 0
    # 5 6  7  8  9
    max_cnt = n*(n+1)//2
    arr = [[0]*n for _ in range(n)]
    pattern = [[1,0],[0,1],[-1,-1]]
    si, sj, cnt = 0, 0, 2
    pat_idx = 0
    arr[0][0] = 1
    while cnt <= max_cnt:
        ni, nj = si+pattern[pat_idx][0],sj+pattern[pat_idx][1]
        if 0<=ni<n and 0<=nj<n and not arr[ni][nj]:
            arr[ni][nj] = cnt
            si, sj = ni, nj
            cnt += 1

        else:
            pat_idx = (pat_idx+1) % 3
    for i in range(n):
        for j in range(n):
            if arr[i][j] != 0:
                answer.append(arr[i][j])
    return answer
728x90