[ programmers ] 구현 - 삼각달팽이

김우경·2020년 11월 10일
0

알고리즘

목록 보기
11/69

문제링크


코딩테스트 연습 - 삼각달팽이


문제 설명


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

문제 풀이


깔끔하게 함수 나눠서 푸는 습관을 들이자 ~

def get_next(cur_y, cur_x, cur_d):
    DELTAS = {'U': (-1, -1), 'D': (1, 0), 'R': (0, 1)}
    dy, dx = DELTAS[cur_d][0], DELTAS[cur_d][1]
    nxt_y, nxt_x = cur_y + dy, cur_x + dx
    return nxt_y, nxt_x

def check_turn(nxt_y, nxt_x, n, snail):
    #범위(0~N)을 벗어났거나 이미 숫자가 채워진 경우 방향 바꿈
    return nxt_y < 0 or nxt_y >= n or nxt_x > nxt_y or snail[nxt_y][nxt_x] != 0

def solution(n):
    answer = []
    #다음방향
    NEXT = {'U': 'D', 'D': 'R', 'R': 'U'}
    N = sum(range(1, n+1))
    snail = [[0] * i for i in range(1, n+1)]

    #초기 좌표와 방향
    cur_y, cur_x, cur_d = 0, 0, 'D'
    for num in range(1, N+1):
        snail[cur_y][cur_x] = num
        print(snail)
        next_y, next_x = get_next(cur_y, cur_x, cur_d)
        if check_turn(next_y, next_x, n, snail):
            cur_d = NEXT[cur_d]
        cur_y, cur_x = get_next(cur_y, cur_x, cur_d)

    for i in snail:
        answer += i
    return answer

알게된 것

  • 2차원 배열 → 1차원 배열
itertools.chain(snail)
profile
Hongik CE

0개의 댓글