새소식

Algorithm/코딩테스트

[프로그래머스 LV0] 정수를 나선형으로 배치하기

  • -

백준 '로봇청소기'에서 호되게 당했기 때문에, 유사문제로 풀어봤다.

lv0이라 쉬울 줄 알았는데 접근하기 꽤나 어려웠다..

이런 유형 왜이렇게 어렵지..

💫문제

 

💫동작 원리

상,하,좌,우로 이동하는 케이스에 따라서, 인덱스 i,j가 각각 고정/증가/감소 세 가지 경우의 형태로 움직이기 때문에, 케이스 분류가 꼭 필요했다.

그 과정에서 핵심은,

경계값을 동적으로 조정하여 위쪽, 아래쪽, 왼쪽, 오른쪽의 경계를 좁혀 나가면서 숫자를 배열에 나선형으로 채우는 것이었다.

 

경계 설정 (top, bottom, left, right):

  • top: 현재 배열의 위쪽 경계.
  • bottom: 현재 배열의 아래쪽 경계.
  • left: 현재 배열의 왼쪽 경계.
  • right: 현재 배열의 오른쪽 경계.

방향 설정 및 경계 조정

  • 오른쪽 이동 (right):
    • for j in range(left, right + 1) 루프를 통해 왼쪽=> 오른쪽으로 이동하면서 숫자를 배열에 채운다.
    • 오른쪽으로 이동한 후에는 위쪽 경계 (top)를 한 칸 아래로 이동한다. 그리고 now 값을 top과 right로 업데이트해 다음 위치를 설정했다.
    • 이후 방향을 "down"으로 변경
  • 아래로 이동 (down):
    • for i in range(top, bottom + 1) 루프를 통해 위=> 아래로 이동하면서 숫자를 배열에 채운다.
    • 아래로 이동한 후에는 오른쪽 경계 (right)를 한 칸 왼쪽으로 이동한다. 그리고 now 값을 bottom과 right로 업데이트했다.
    • 이후 방향을 "left"로 변경.
  • 왼쪽 이동 (left):
    • for j in range(right, left - 1, -1) 루프를 통해 오른쪽=>왼쪽으로 이동하면서 숫자를 배열에 채운다.
    • 왼쪽으로 이동한 후에는 아래쪽 경계 (bottom)을 한 칸 위로 이동한다. 그리고 now 값을 bottom과 left로 업데이트
    • 이후 방향을 "up"으로 변경합니다.
  • 위로 이동 (up):
    • for i in range(bottom, top - 1, -1) 루프를 통해 아래=> 위로 이동하면서 숫자를 배열에 채운다.
    • 위로 이동한 후에는 왼쪽 경계 (left)를 한 칸 오른쪽으로 이동한다. 그리고 now 값을 top과 left로 업데이트.
    • 이후 방향을 "right"로 변경하여 다시 오른쪽으로 이동하는 사이클을 반복.

💫코드

def solution(n):
    tmp_map = [[0] * n for _ in range(n)]  # n x n 크기의 배열 생성
    number = 1  # 0이 아닌 1부터 시작
    direction = "right"
    now = (0, 0)  # 시작 좌표
    
    top, bottom = 0, n - 1  # 위쪽과 아래쪽 경계
    left, right = 0, n - 1  # 왼쪽과 오른쪽 경계

    while number <= n * n:  # 숫자가 n^2까지 반복
        if direction == "right":
            for j in range(left,right+1):
                if tmp_map[now[0]][j] !=0:
                    break
                tmp_map[now[0]][j] = number
                number+=1
            top += 1  # 위쪽 경계를 한 칸 아래로 내림
            now = (top, right)  # 현재 위치 업데이트    
            direction = "down"
        elif direction == "down":
            for i in range(top,bottom+1):
                if tmp_map[i][now[1]] !=0:
                    break
                tmp_map[i][now[1]] = number
                number+=1
            right -= 1  # 위쪽 경계를 한 칸 아래로 내림
            now = (bottom, right)  # 현재 위치 업데이트    
            direction = "left"
        elif direction == "left":
            for j in range(right,-1,-1):
                if tmp_map[now[0]][j] !=0:
                    break
                tmp_map[now[0]][j] = number
                number+=1
            bottom -= 1  # 위쪽 경계를 한 칸 아래로 내림
            now = (bottom, left)  # 현재 위치 업데이트    
            direction = "up"
            
        elif direction == "up":
            for i in range(bottom,-1,-1):
                if tmp_map[i][now[1]] !=0:
                    break
                tmp_map[i][now[1]] = number
                number+=1
            left += 1  # 위쪽 경계를 한 칸 아래로 내림
            now = (top, left)  # 현재 위치 업데이트    
            direction = "right"
        
            
  # 결과 출력
    for row in tmp_map:
        print(row)

    return tmp_map
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.