
코딩테스트 역량 강화 교육(거점형 특화 프로그램)이라는 프로그램에 참여해 공부한 내용입니다.
- IT 직무로 취업을 희망하는 지원자들이 코딩테스트를 통과할 수 있는 알고리즘을 활용한 프로그래밍 교육이며, PCCP 자격증 취득이 목표인 프로그램
- 상세 설명 - 수원대학교(대학일자리 플러스센터)
앞서 공부한 시뮬레이션 - 청소 로봇(ver 1), 시뮬레이션 - 청소 로봇(ver 2), 시뮬레이션 - 로봇의 이동에 장애물 기능을 추가한 문제인 청소 로봇(ver 3) 문제를 풀어보겠다.
청소 로봇이 방을 청소하려고 합니다. 방은 n*n 격자판 지도로 표현됩니다. 방에는 장애물이 있고, 장애물이 있는 지점은 로봇이 지나갈 수 없습니다. 로봇은 지도의 왼쪽 가장 위 격자에서 3시 방향(오른쪽)을 보고 있습니다. 로봇이 한 격자를 이동하는데 걸리는 시간은 1초입니다.
로봇은 매초 한 칸씩 보고 있는 방향으로 이동합니다. 만약 지도 끝으로 이동해 더 이상 전진 할 수 없거나 또는 장애물을 만나면 제자리에서 시계방향으로 90도 회전합니다. 회전하는데도 1초의 시간이 필요합니다.
매개변수 board에 방의 지도정보가 주어지고, k에 초시간이 주어지면 로봇이 움직이기 시작해 서 k초 후에 멈춥니다. k초 후 로봇의 위치를 반환하는 프로그램을 작성하세요.

| 격자판 크기(n) | 입력(moves) | 출력(answer) |
|---|---|---|
| [[0, 0, 0, 0, 0], [0, 1, 1, 0, 0], [0, 0, 0, 0, 0], [1, 0, 1, 0, 1], [0, 0, 0, 0, 0]] | 10 | [2, 2] |
| [[0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0]] | 20 | [4, 5] |
| [[0, 0, 1, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0], [1, 0, 0, 0, 1], [0, 0, 0, 0, 0]] | 25 | [0, 1] |

로봇이 0행 0열에서 출발해 10초 후에 2행 2열에서 멈춥니다.
def solution(board, k):
r = c = 0
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
# 초기 방향 오른쪽
d = 1
# 격자판 길이 n*n
n = len(board)
# k가 0이 되기 전까지만 반복
while(k > 0):
# 밖으로 나갔는지 확인할 nr, nc 설정
nr = r + dr[d]
nc = c + dc[d]
# board[nr][nc] == 0 -> 장애물 유무 확인
if nr < 0 or nr >= n or nc < 0 or nc >= n or board[nr][nc] == 1:
d = (d+1) % 4
k -= 1
continue
r = nr
c = nc
k -= 1
return [r, c]
print(solution([[0, 0, 0, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 1, 0, 1],
[0, 0, 0, 0, 0]], 10))
print(solution([[0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1],
[1, 1, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]], 20))
print(solution([[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1],
[0, 0, 0, 0, 0]], 25))
이 문제는 청소 로봇(ver 2)의 격자판 밖으로 나갈 때 예외처리, 로봇의 이동의 시점 변경 기능을 합친 문제이며, 제한 시간 k도 주어진다.
dr, dc를 12시부터 시계방향으로 설정r, c에 로봇의 초기 위치인 0으로 설정d에 로봇의 초기 시점인 오른쪽(1)로 설정nr와 nc 설정nr와 nc가 주어진 격자판 크기의 인덱스와 비교하며, board[nr][nc] == 1인 경우(장애물 존재)에는 시점 d를 시계방향으로 90도 돌려주고 -1초d에 따라 한 칸 이동하고 -1초moves을 다 실행하면 return [r, c]k가 0이 되면 while문에서 나오고 return [r, c]