탐색으로 풀어보려고 했으나 경우의 수를 모두 나누기가 어려웠습니다. 다른사람들의 풀이를 참고해 보니 direction 값을 right부터 시작하여 순차적으로 바꾸어나가는 이터레이션을 돌리면 간단하게 해결이 가능했습니다.
문제 설명 : 양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
코드로 작성해 봅시다.
# 예시 (n=3일 때)
n = 3
graph = [[0] * n for _ in range(n)]
graph
# [[0, 0, 0],
# [0, 0, 0],
# [0, 0, 0]]
먼저 함수 초반에 그래프의 초기값은 다음과같이 세팅해줍니다. 확실히 리스트 컴프리핸션은 자유자재로 쓸 수 있어야 합니다.
# 기본 뼈대
for i in range(1, n**2+1):
if dir == 'r':
y += 1
elif dir == 'd':
x += 1
elif dir == 'l':
y -= 1
elif dir == 'u'
x -= 1
방향의 값은 오른쪽부터 시작해서 나선형으로 오른쪽 -> 아래 -> 왼쪽 -> 위 -> 오른쪽 ...(반복) 순서로 뱅글뱅글 돌아가게 해줄 겁니다. 그럼 완성된 함수로 작성해 보겠습니다.
def solution(n):
# 만약 n이 1인 경우 빠르게 종료
if n == 1:
return [[1]]
# 초기값 세팅 : (0, 0)으로부터 오른쪽 이동부터 시작한다.
graph = [[0] * n for _ in range(n)]
x = 0
y = 0
direction = 'R'
# n의 제곱번 이터레이션을 돌려 준다.
for i in range(1, n**2 + 1):
graph[x][y] = i
# right : x값 고정, y값만 1 증가
if direction == 'R':
y += 1
# 만약 끝까지 갔거나 그 다음 값이 0이 아니라면 방향 변경
if y == n-1 or graph[x][y+1] != 0:
direction = 'D'
# down : y값 고정, x값만 1 증가
elif direction == 'D':
x += 1
# 만약 끝까지 갔거나 그 다음 값이 0이 아니라면 방향 변경
if x == n-1 or graph[x+1][y] != 0:
direction = 'L'
# left : x값 고정, y값만 1 감소
elif direction == 'L':
y -= 1
# 만약 끝까지 갔거나(y값이 0) 그 다음 값이 0이 아니라면 방향 변경
if y == 0 or graph[x][y-1] != 0:
direction = 'U'
# up : y값 고정, x값만 1 감소
elif direction == 'L':
x -= 1
# 만약 끝까지 갔거나 그 다음 값이 0이 아니라면 방향 변경
if x == n-1 or graph[x-1][y] != 0:
direction = 'R'
return graph
완성된 함수에는 더이상 갈 곳이 없거나 가야할 곳에 0이 아닌 숫자가 있는 경우 방향을 변경해주는 기능이 추가되었습니다. 25번 이터레이션을 돌면서 각각의 순서에 맞게 번호가 부여됩니다.
아휴 재밌다