코딩테스트 역량 강화 교육(거점형 특화 프로그램)이라는 프로그램에 참여해 공부한 내용입니다.
- IT 직무로 취업을 희망하는 지원자들이 코딩테스트를 통과할 수 있는 알고리즘을 활용한 프로그래밍 교육이며, PCCP 자격증 취득이 목표인 프로그램
- 상세 설명 - 수원대학교(대학일자리 플러스센터)
앞서 공부한 시뮬레이션 알고리즘을 사용해 정수를 나선형으로 배치 문제를 풀어보겠다.
양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
입력(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]] |
행\열 | 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 합니다.
행\열 | 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 합니다.
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
n*n
배열을 0
으로 다 초기화dr
, dc
를 12시부터 시계방향으로 설정r
, c
에 로봇의 초기 위치인 0
으로 설정d
에 로봇의 초기 시점인 오른쪽(1)으로 설정과 cnt = 1
설정nr
와 nc
설정nr
와 nc
가 주어진 격자판 밖으로 벗어나나 확인과 동시에 answer[nr][nc] != 1
인 경우(정수 이미 존재)에는 다음 루프에 못 움직이는 것을 의미하므로, 다음 루프문을 위해 시점 d
를 시계방향으로 90도 돌려주고 continue
answer[r][c]
에 cnt
를 저장한 후 cnt += 1
r
, c
를 다음 루프문 위치 nr
, nc
로 변경while - if
으로 인해 마지막 원소는 cnt
가 저장 안 되므로, while
문 종료될 때 r
, c
에 마지막 원소의 위치가 저장되어 있는 걸 이용해 answer[r][c] = cnt
실행하고 return answer