[프로그래머스 Lv2] 삼각 달팽이 (파이썬)

Jewon Joel Park·2022년 7월 28일
0

Programmers-solution

목록 보기
32/34

문제 링크


문제 설명

정수 n이 주어질 때 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 반환하는 함수 작성


풀이 코드

def solution(n):
    arr = [[0] * i for i in range(1, n+1)]  # 주어진 n에 따른 직각삼각형 생성
    dirs = [(1, 0), (0, 1), (-1, -1)]  # 방향 집합(아래, 오른쪽, 왼쪽위)
    turn = 0  # 방향을 돌려줄 지표
    y, x = 0, 0  # 시작 좌표
    i = 1
    end_num = sum(i for i in range(1, n+1))  # 직각삼각형 내부의 칸 수
    while i <= end_num:
        arr[y][x] = i
        i += 1
        dy, dx = dirs[turn]
        ny = y + dy
        nx = x + dx
        # 다음 칸이 0부터 n 범위 내에 위치하고 값이 0일 경우 y, x값 변경
        if 0 <= ny < n and 0 <= nx < n and arr[ny][nx] == 0:
            y, x = ny, nx
        # 범위를 벗어나거나 값이 0이 아닐 경우 방향 변경
        else:
            turn = (turn + 1) % 3
            dy, dx = dirs[turn]
            y += dy
            x += dx
    ans = []
    for row in arr:
        for item in row:
            ans.append(item)
    return ans

코드 설명

  1. 주어진 정수 n에 따른 직각삼각형 형태의 배열 arr 생성
  2. 아래 예시와 같게 되게끔 숫자의 진행방향을 설정한 튜플 배열 dirs 생성
[1]
[2, 9]
[3, 10, 8]
[4, 5, 6, 7]


[1]
[2, 12]
[3, 13, 11]
[4, 14, 15, 10]
[5, 6, 7, 8, 9]


[1]
[2, 15]
[3, 16, 14]
[4, 17, 21, 13]
[5, 18, 19, 20, 12]
[6, 7, 8, 9, 10 ,11]
  1. 방향을 돌려줄 변수 turns와 최초 시작점 y, x 및 배열에 넣을 숫자 i와 생성된 전체 칸의 수이자 마지막 수인 end_num 설정
  2. while Loop으로 iend_num보다 작거나 같을 때 그래프 탐색을 반복
  3. 다음 칸이 0부터 n 범위 내에 위치하고 값이 0일 경우 y, x값 변경
  4. 범위를 벗어나거나 배열 내 값이 0이 아닐 경우(이미 방문했던 경우) 방향을 변경하여 좌표 업데이트
profile
10년을 돌고 돌아 마침내 제자리를 찾은 문과 출신 Python 개발자의 인생기록장

0개의 댓글