Python

[Python]나선형으로 배치한 2차원 배열

Captain Herlock 2025. 3. 22. 23:38
반응형

주어진 문제는 양의 정수 n을 받아서 n x n 크기의 배열에 1부터 n^2까지의 숫자를 시계방향으로 나선형 배열로 배치하는 문제입니다.

해결 아이디어

이 문제는 나선형 배열을 만드는 문제입니다. 나선형 배열은 특정 방향으로 숫자를 배치하면서 테두리를 따라가며, 그 다음에는 내부로 이동하여 반복적으로 숫자를 채우는 방식입니다.

해결 방법

  1. 시작 위치는 [0][0]입니다.
  2. 방향은 오른쪽, 아래, 왼쪽, 위로 차례대로 바뀝니다. 이 방향을 반복하면서 배열을 채워 나갑니다.
  3. 배열을 채울 때, 범위를 벗어나거나 이미 숫자가 들어간 곳에는 다른 방향으로 전환합니다.
  4. 반복문을 통해 숫자들을 배열에 할당합니다.

풀이 코드

def solution(n):
    # n x n 배열을 0으로 초기화
    answer = [[0] * n for _ in range(n)]
    
    # 방향을 정의 (오른쪽, 아래, 왼쪽, 위)
    directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # (dx, dy)
    x, y = 0, 0  # 시작 좌표
    current_direction = 0  # 방향 인덱스 (0 -> 오른쪽, 1 -> 아래, 2 -> 왼쪽, 3 -> 위)
    num = 1  # 시작 숫자
    
    while num <= n * n:
        # 현재 위치에 숫자 배치
        answer[x][y] = num
        num += 1
        
        # 다음 위치 계산
        next_x = x + directions[current_direction][0]
        next_y = y + directions[current_direction][1]
        
        # 범위 체크: 배열을 벗어나지 않거나, 이미 숫자가 있는 곳이 아니면 이동
        if not (0 <= next_x < n and 0 <= next_y < n and answer[next_x][next_y] == 0):
            # 방향 전환
            current_direction = (current_direction + 1) % 4
            next_x = x + directions[current_direction][0]
            next_y = y + directions[current_direction][1]
        
        # 위치 업데이트
        x, y = next_x, next_y
    
    return answer

코드 설명

  1. 배열 초기화:
    • answer = [[0] * n for _ in range(n)]: n x n 크기의 배열을 0으로 초기화합니다.
  2. 방향 정의:
    • directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]: 시계방향으로 진행하는 네 가지 방향을 (dx, dy) 형태로 정의합니다.
      • (0, 1) -> 오른쪽
      • (1, 0) -> 아래
      • (0, -1) -> 왼쪽
      • (-1, 0) -> 위
  3. 위치와 방향 초기화:
    • x, y = 0, 0: 시작 좌표를 (0, 0)으로 설정합니다.
    • current_direction = 0: 초기 방향은 0 (오른쪽)입니다.
    • num = 1: 첫 번째 숫자부터 시작합니다.
  4. 반복문:
    • 숫자가 n^2까지 채워지면 종료됩니다.
    • 현재 위치에 숫자를 넣고, 그 후 다음 위치를 계산합니다.
    • 만약 범위를 벗어나거나 이미 값이 있는 곳이라면 방향을 전환합니다.
    • 각 방향으로 이동하며 숫자를 배치합니다.

예시 실행

n = 3
result = solution(n)
for row in result:
    print(row)

출력:

[1, 2, 3]
[8, 9, 4]
[7, 6, 5]

예시 설명

n = 3일 때, 3 x 3 배열을 시계방향으로 나선형으로 채우면 위와 같은 배열이 됩니다. 숫자는 1부터 시작해서 시계방향으로 배치됩니다.

최종 요약

이 문제는 시계방향으로 배열을 채워가는 방식으로 n x n 배열을 구성하는 문제입니다. 이를 위해 방향을 정의하고, 범위를 벗어나지 않도록 하며, 방향을 전환하면서 값을 배치하는 방식으로 해결할 수 있습니다.