[Programmers] 정수를 나선형으로 배치하기
https://school.programmers.co.kr/learn/courses/30/lessons/181832
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
def solution(n):
snake = [n]
answer= [[0 for i in range(n)] for j in range(n)]
print(answer)
d = ((0,1),(1,0),(0,-1),(-1,0))
count, x, y = 0, -1, 0
while n > 1 :
n -= 1
snake.append(n)
snake.append(n)
for i in range(len(snake)) :
for j in range(snake[i]) :
y += d[i%4][0]
x += d[i%4][1]
count += 1
answer[y][x] = count
return answer
[snake 설정]
나선형으로 돌 때, n이 5인 상황이면
5칸 오른쪽으로, 4칸 아래로, 4칸 왼쪽으로, 3칸 위로,
3칸 오른쪽으로, 2칸 아래로, 2칸 왼쪽으로, 1칸 위로,
1칸 오른쪽으로
간다.
몇 칸 가는지만 집중해보면
처음 n칸만 한 번 가고,
n-1칸씩 두 번,
n-2칸씩 두 번,
...
1칸씩 두 번 간다.
따라서 snake에 처음 [n], n칸만 한 번 저장하고
while n >1 문을 사용하여 1씩 줄어드는 n을 두번씩 append한다.
[answer 설정]
answer는 n x n 배열에 0으로 채워 저장한다.
[d 설정]
d는 방향이다. d = ((0,1),(1,0),(0,-1),(-1,0))
이 배열은 위, 오른쪽, 아래, 왼쪽 방향을 나타내는 좌표 튜플을 저장
[count 설정]
count, x, y = 0, -1, 0
for i in range(len(snake)) :
for j in range(snake[i]) :
y += d[i%4][0]
x += d[i%4][1]
count += 1
answer[y][x] = count
나선형으로 돌 때, n이 5인 상황이면
5칸 오른쪽으로, 4칸 아래로, 4칸 왼쪽으로, 3칸 위로,
3칸 오른쪽으로, 2칸 아래로, 2칸 왼쪽으로, 1칸 위로,
1칸 오른쪽으로
간다.
'오른쪽 -> 아래 -> 왼쪽 -> 위'
x = -1, y = 0 으로 저장하는 이유?
--> 이동 방향이 오른쪽, 아래, 왼쪽, 위 순서대로 진행되기 때문입니다. 따라서 x 값이 0부터 시작하면서 오른쪽으로 이동하다가 첫 번째 열에서는 이동할 수 없는 상황이 발생하게 됩니다. 그렇기 때문에 시작할 때 x 값을 -1로 초기화하여 첫 번째 열에서도 이동할 수 있도록 합니다. 반대로 y 값은 첫 번째 열에서도 이동할 수 있도록 0으로 초기화합니다.
방향이 4번씩 반복되므로 i%4한 좌표값으로 설정!
count를 하나씩 늘려가며 answer[y][x]값에 저장하기!