Python
[Python]나선형으로 배치한 2차원 배열
Captain Herlock
2025. 3. 22. 23:38
반응형
주어진 문제는 양의 정수 n을 받아서 n x n 크기의 배열에 1부터 n^2까지의 숫자를 시계방향으로 나선형 배열로 배치하는 문제입니다.
해결 아이디어
이 문제는 나선형 배열을 만드는 문제입니다. 나선형 배열은 특정 방향으로 숫자를 배치하면서 테두리를 따라가며, 그 다음에는 내부로 이동하여 반복적으로 숫자를 채우는 방식입니다.
해결 방법
- 시작 위치는 [0][0]입니다.
- 방향은 오른쪽, 아래, 왼쪽, 위로 차례대로 바뀝니다. 이 방향을 반복하면서 배열을 채워 나갑니다.
- 배열을 채울 때, 범위를 벗어나거나 이미 숫자가 들어간 곳에는 다른 방향으로 전환합니다.
- 반복문을 통해 숫자들을 배열에 할당합니다.
풀이 코드
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
코드 설명
- 배열 초기화:
- answer = [[0] * n for _ in range(n)]: n x n 크기의 배열을 0으로 초기화합니다.
- 방향 정의:
- directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]: 시계방향으로 진행하는 네 가지 방향을 (dx, dy) 형태로 정의합니다.
- (0, 1) -> 오른쪽
- (1, 0) -> 아래
- (0, -1) -> 왼쪽
- (-1, 0) -> 위
- directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]: 시계방향으로 진행하는 네 가지 방향을 (dx, dy) 형태로 정의합니다.
- 위치와 방향 초기화:
- x, y = 0, 0: 시작 좌표를 (0, 0)으로 설정합니다.
- current_direction = 0: 초기 방향은 0 (오른쪽)입니다.
- num = 1: 첫 번째 숫자부터 시작합니다.
- 반복문:
- 숫자가 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 배열을 구성하는 문제입니다. 이를 위해 방향을 정의하고, 범위를 벗어나지 않도록 하며, 방향을 전환하면서 값을 배치하는 방식으로 해결할 수 있습니다.