[프로그래머스] LV.0 - 정수를 나선형으로 배치 | 파이썬

SangJin Ham·2023년 6월 26일
0

프로그래머스

목록 보기
2/20
post-thumbnail

코딩테스트 역량 강화 교육(거점형 특화 프로그램)이라는 프로그램에 참여해 공부한 내용입니다.

LV.0 - 정수를 나선형으로 배치

앞서 공부한 시뮬레이션 알고리즘을 사용해 정수를 나선형으로 배치 문제를 풀어보겠다.


문제 설명

양의 정수 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까지 숫자를 채울 수 있습니다.
행\열0123
01234
11213145
21116156
310987

따라서 [[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까지 숫자를 채울 수 있습니다.
행\열01234
012345
1161718196
2152425207
3142322218
4131211109

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


코드

def solution(n):
    answer = [[0]*n for _ in range(n)] 

    dr = [-1, 0, 1, 0]
    dc = [0, 1, 0, -1]

    r, c = 0, 0
    d, cnt = 1, 1

    while(n*n > cnt):
        nr = r + dr[d]
        nc = c + dc[d]
        if nr < 0 or nr >= n or nc < 0 or nc >=n or answer[nr][nc] != 0:
            d = (d + 1) % 4
            continue 
        answer[r][c] = cnt
        cnt += 1
        r = nr
        c = nc
    # if문으로 인해 마지막 원소 안 되므로 while문 끝나고 적용
    answer[r][c] = cnt
    return answer

풀이

  1. 먼저 n*n 배열을 0으로 다 초기화
  2. 방향 배열 dr, dc12시부터 시계방향으로 설정
  3. r, c에 로봇의 초기 위치인 0으로 설정
  4. d에 로봇의 초기 시점인 오른쪽(1)으로 설정과 cnt = 1 설정
  5. 다음 루프 위치를 나타내는 변수 nrnc 설정
  6. nrnc가 주어진 격자판 밖으로 벗어나나 확인과 동시에 answer[nr][nc] != 1인 경우(정수 이미 존재)에는 다음 루프에 못 움직이는 것을 의미하므로, 다음 루프문을 위해 시점 d를 시계방향으로 90도 돌려주고 continue
  7. 현재 위치인 answer[r][c]cnt를 저장한 후 cnt += 1
  8. 현재 위치 r, c를 다음 루프문 위치 nr, nc로 변경
  9. while - if으로 인해 마지막 원소는 cnt가 저장 안 되므로, while문 종료될 때 r, c에 마지막 원소의 위치가 저장되어 있는 걸 이용해 answer[r][c] = cnt 실행하고 return answer
profile
끄적끄적

0개의 댓글