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

박선영·2023년 10월 5일
0
post-thumbnail

Lv0_정수를 나선형으로 배치하기

📄Description

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

제한 조건

  • 1 ≤ n ≤ 30

입출력 예시

nresult
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번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.

행 / 열012
0123
1121314
2111615
31098

따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.


🤔생각 정리

  1. for 중첩 반복문을 사용해서 접근해야겠네
  2. 오른쪽 -> 아래 -> 왼쪽 -> 위 순서로 숫자를 채우니까 방향을 이용해야겠네
  3. 반복횟수를 계산해야겠네
    • 방향: 4번 (우 -> 하 -> 좌 -> 상)
    • 반복 횟수: 마지막 숫자가 중앙에서 끝나니까 (n+1)//2(n+1)//2번 반복
  4. 이동하는데 배열 밖이거나 이미 채워지면 방향을 바꿔야겠네.

💡Pseudo Code💡

1. 방향 값 지정 dx, dy (->->->)
2. 초기 값 지정 - cur=0, x=0, y=-1, ans=빈 배열(nxn)
3. 		for 반복횟수 (n+1)//2:
4.			for 방향 4:
5.				현재 방향값 할당 -> r, c
6.				cur, x, y 갱신
7.				현재 (x, y)에 숫자를 채울 수 있다면:
8.					채울 수 없을 때까지 이동하며 배치

🖥️코드화

def solution(n):
    ans = [[0]*n for _ in range(n)]
    dx, dy = (0, 1, 0, -1), (1, 0, -1, 0) # 방향 벡터
    cur, x, y = 0, 0, -1 # 초기값 지정
    for _ in range((n+1)//2): # 전체 반복횟수
        for i in range(4): # 방향
            r, c = dx[i], dy[i]
            
            cur, x, y = cur+1, x+r, y+c
            # 이동가능하고 빈 공간인 경우만 - 숫자를 채울 수 있다면
            while -1<x<n and -1<y<n and ans[x][y]==0:
                ans[x][y] = cur
                cur, x, y = cur+1, x+r, y+c
            cur, x, y = cur-1, x-r, y-c # 되돌리기
            # print(r, c, ans) 검증용
                
    return ans

profile
데이터를 만지는 사람

0개의 댓글