𝘼𝙣𝙖𝙡𝙮𝙨𝙞𝙨/ᴀʟɢᴏʀɪᴛʜᴍ

[Programmers] 정수를 나선형으로 배치하기

콜라맛갈비 2023. 7. 10. 14:52
728x90

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]값에 저장하기!

 

728x90