본문 바로가기

IT/Python

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

728x90

 

 

시계방향, 바깥에서 안으로 들어가는 나선 방향을 따라 숫자를 배치하는 문제

더보기

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

제한사항
1 ≤ n ≤ 30

 

nxn 행렬 생성

$($0,0$)$ 부터 조건에 따라 숫자를 배치하기 위해 초기값 $($0,0$)$ 설정

 

dr = $($0,1,0,-1$)$ : 0, 하, 0, 상

dc = $($1,0,-1,0$)$: 우, 0, 좌, 0

>>> 시계방향$($우, 하, 좌, 상$)$으로 이동

 

첫 바퀴는 각 방향마다 n-1 번씩 이동하면 한 바퀴를 돌아서 원자리로 돌아옵니다.

그래서 좌,하 방향으로 이동해서 다음 바퀴를 돌며 이번에는 각 방향마다 n-3번씩 이동합니다.

 

제가 작성한 코드를 따라서 진행하면, n이 홀수 일 때는 마지막 n^2를 집어 넣을 때 각 방향 이동 횟수가 n-n=0이 되어 입력이 안됩니다.

그래서 마지막 값을 채워넣는 if문을 추가했습니다.

 

def solution(n):
    A = [[0]*n for _ in range(n)]
    r, c, dr, dc = 0, 0, (0,1,0,-1), (1,0,-1,0)

    i = 1
    for m in range(n-1,0,-2):
        for j in range(4):
            for _ in range(m):
                A[r][c] = i
                r, c = r + dr[j], c + dc[j]     
                i += 1
        r, c = r + 1 , c + 1
        
    if n % 2 == 1:
        A[r][c] = n**2
        
    return A

 

 

 

더보기

입출력 예

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

따라서 [[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 합니다.