[PCCP] 시뮬레이션 - 청소 로봇(ver 3) | 파이썬

SangJin Ham·2023년 6월 26일
0
post-thumbnail

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


앞서 공부한 시뮬레이션 - 청소 로봇(ver 1), 시뮬레이션 - 청소 로봇(ver 2), 시뮬레이션 - 로봇의 이동에 장애물 기능을 추가한 문제인 청소 로봇(ver 3) 문제를 풀어보겠다.

청소 로봇(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]

입력예제 1 설명

로봇이 0행 0열에서 출발해 10초 후에 2행 2열에서 멈춥니다.


제한사항

  • board의 크기 (3 <= n <= 100)
  • board에서 0은 빈 공간이고, 1은 장애물이다.
  • board에서 로봇의 시작위치는 0행 0열(가장 왼쪽 가장 위)이다.
  • 변수 k는 1,000이하의 자연수이다.

작성한 코드

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도 주어진다.

  1. 방향 배열 dr, dc12시부터 시계방향으로 설정
  2. r, c에 로봇의 초기 위치인 0으로 설정
  3. d에 로봇의 초기 시점인 오른쪽(1)로 설정
  4. 격자판 밖으로 나갔는지 확인할 변수 nrnc 설정
  5. nrnc가 주어진 격자판 크기의 인덱스와 비교하며, board[nr][nc] == 1인 경우(장애물 존재)에는 시점 d를 시계방향으로 90도 돌려주고 -1초
  6. 앞서 if문으로 이동할 수 없다면 시점 d를 설정했으니, d에 따라 한 칸 이동하고 -1초
  7. 입력된 명령 moves을 다 실행하면 return [r, c]
  8. 제한시간 k0이 되면 while문에서 나오고 return [r, c]
profile
끄적끄적

0개의 댓글