본문 바로가기
코딩테스트/알고리즘

[알고리즘] 달팽이 배열 채우기

by Hwan,. 2021. 11. 6.
728x90
반응형

1. 달팽이 배열

 - 외곽부터 정사각형을 채우고 대각선 아래로 이동하여 반복


 

2. 방법별 코드 정리

 2-1) 코드 

  - 외부부터 한바퀴씩 작성

  - 시계방향으로 회전하는 달팽이 배열을 이동 좌표를 미리 계산하는 방식으로 작성

# 범위내 좌표이동
def add_direction(x, y, arr_direction, int_direction, int_k):
    a, b = 0, 0
    
    # x 좌표 이동
    next_x = x + arr_direction[int_direction][0]
    if next_x >= 0 and next_x < int_k:
        a = next_x
    # y 좌표 이동
    next_y = y + arr_direction[int_direction][1]
    if next_y >= 0 and next_y < int_k:
        b = next_y
    
    return a, b

def snailArray_Generator(k):
    # k가 0보다 작거나 같으면 종료
    if k <= 0:
        return []

    # 이동할 좌표 구하기
    arr_Move = []
    # right, down, left, up
    arr_direction = [(1, 0), (0, 1), (-1, 0), (0, -1)]
    # 최초 시작 좌표
    x, y = 0, 0

    # 루프 한번에 한 바퀴
    for n in range(k-1, 0, -2):
        # 각 방향으로
        for int_direction in range(4):
            # n개 씩 채우기
            for _ in range(n):
                arr_Move.append((x, y))
                # 좌표 이동
                x, y = add_direction(x, y, arr_direction, int_direction, k)
        
        # 다음 시작 좌표로 이동
        x, y = x+1, y+1

    # 마지막 이동한 위치가 array에 이미 있으면 추가 안함
    if not (x, y) in arr_Move:
        arr_Move.append((x, y))

    # 값 넣기
    arr_map = [[0 for _ in range(k)] for _ in range(k)]
    value = 0
    for move in arr_Move:
        value += 1
        arr_map[move[1]][move[0]] = value

    return arr_map


# map 출력
for map in snailArray_Generator(0):
    print(map)

 

 2-1) 결과

728x90
반응형

댓글