코딩테스트/PYTHON

[프로그래머스][PYTHON] Lv. 0 정수를 나선형으로 배치하기

_알파카 2024. 2. 19. 00:31
728x90

드디어 기초 문제의 마지막 문제이다! ❤❤

 

정답률이 45%인 문제이다ㅠㅠ

그래도 한 번 풀어보자!

 

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/181832

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 코드

 

결국 못풀어서 도움을 받아 풀었다ㅠㅠ

넘 어려운 문제다ㅠㅠ

역시 정답률 45%.......

우울하담ㅠㅠ

def solution(n):
    dy = [0,1,0,-1] # 오른,아래,왼,위
    dx = [1,0,-1,0]

    arr = [ [0 for x in range(n)] for _ in range(n)]

    x=0
    y=0
    arr[y][x] = 1
    cnt = 2

    k=0

    while cnt<=n*n:
        while 1:
            ny = y + dy[k] 
            nx = x + dx[k]

            if ny<0 or ny >=n or nx<0 or nx >=n or arr[ny][nx]!=0:
                break

            y = ny
            x = nx

            arr[y][x]= cnt
            cnt+=1
            
            for i in arr:
                print(i)
            print('-------------')

        k = (k+1) % 4

    return arr

 

하나씩 파고 들어보자. 

dy = [0,1,0,-1]
dx = [1,0,-1,0]
# 각각 x와 y가 어디로 이동하는지...
# 즉, (1, 0) -> 오른쪽, (0, 1) > 아래쪽, (-1, 0) -> 왼쪽, (0, -1) -> 위쪽

 

이제, dy와 dx는 어디로 움직일지를 나타내는 벡터가 된다. 

이제 첫 시작은 0, 0으로 두자!

그렇게 되면 처음에 해당하는 위치는

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

 

빨갛게 표시한 곳이 된다!

이제 그 값을 1로 지정하고, 넣을 값(cnt)를 2로 지정한다. 

 

이 때, k는 오, 아, 왼, 위 중 어디로 움직일지를 나타내는 값이다!

 

while문을 도는데..

while문의 조건은 채울 값이 n^2이 되면 끝나게 된다.

이 때, ny, nx는 어디로 움직일 것인지. 즉, 현재 값이 오른쪽으로 갈 것인지, 아래로 갈 것인지 등을 나타내며, 

궁극적으로는 좌표값을 나타낸다. 

 

만약, 좌표가 0보다 작거나 n의 값을 넘어가게 된다면 while문을 벗어나고, 

만약 오->아 처럼 방향을 바꿀 때, 0이 아닌 값이 있다면 값을 채우는 것을 벗어나게 된다!

 

따라서 오른쪽 이동 -> 아래 이동 -> 왼쪽 이동 -> 위쪽 이동

을 하면서 값을 차례대로 채우며 나선형으로 값을 채우게 된다!

 

이 때, k는 어디로 이동할지 나타내는 값이라고 했는데, 오-> 아->왼->위를 차례대로 움직이므로

(k+1) % 4를 하며 순서대로 바꾸게 된다. 

 



많이 복잡하고 너무 어려운 문제였다..

풀이를 까먹을 때쯤 다시 풀어볼 예정이다. 

어렵지만 새로운 것을 알게되어서 좋다. 

그래도 나중에는 잘 풀 수 있겠지. 

 

끄읏-!

728x90