바위 뚫는중

[프로그래머스] Lv0. 정수를 나선형으로 배치하기 Python 본문

Algorithms/프로그래머스

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

devran 2023. 9. 29. 01:19
반응형

문제 설명

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ n ≤ 30

입출력 예

n result

4 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
5 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]

입출력 예 설명

입출력 예 #1

  • 예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.행 \ 열 0 1 2 3
    0 1 2 3 4
    1 12 13 14 5
    2 11 16 15 6
    3 10 9 8 7
    따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.

입출력 예 #2

  • 예제 2번의 n의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.행 \ 열 0 1 2 3 4
    0 1 2 3 4 5
    1 16 17 18 19 6
    2 15 24 25 20 7
    3 14 23 22 21 8
    4 13 12 11 10 9
    따라서 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]를 return 합니다.

풀이

음 대박이다 Lv.0 이라그러길래 엄청 간단한 문제일 줄 알았더니 전혀 아니었다 ㅎ

나선형 방향 : 우 하 좌 상 으로 이동한다

#우 하 좌 상 순
dx = [1,0,-1,0]
dy = [0,1,0,-1]

x, y = 0,0 
dir = 0

방향좌표, 처음좌표, dir은 방향좌표의 인덱스이다! 즉 나선형으로 움직이기위해선 dir의 숫자가 0~3으로 변경되면 된다 (이렇게 범위가 3이면 4로 나눠준 나머지로 0,1,2,3, 차례로 하면 편함)

def solution(n):
    answer = [[0] * n for i in range(n)]    
    # 우 하 좌 상 
    dx = [1, 0, -1, 0]
    dy = [0, 1, 0, -1]
    dir = 0
    x, y = 0,0 #시작 좌표
    
    
    for i in range(1, (n*n)+1):
        answer[y][x] = i
        nx = x + dx[dir] #다음좌표
        ny = y + dy[dir] #다음좌표
        
        #다음좌표가 벽에걸리거나 숫자가 차있거나 등등이면
        if nx<0 or ny<0 or nx>=n or ny>=n or answer[ny][nx] != 0:
            dir = (dir+1)%4 #0,1,2,3 순서 우하좌상 순서 
            nx = x + dx[dir]
            ny = y + dy[dir] 
            #바뀐 방향으로 다음좌표 재설정
        
        #바뀐좌표로 다시 반복
        x = nx
        y = ny

    return answer
반응형