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