새소식

코딩테스트/문제풀이

[프로그래머스 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

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

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