[백준] q14503 로봇 청소기

2 분 소요

문제

주어진 매뉴얼에 따라 움직이는 로봇 청소기가 있다. 첫째 줄에 공간의 세로 크기 N과 가로 크기 M이 주어진다. 둘째 줄에 로봇 청소기가 있는 칸의 좌표 (r, c)와 바라보는 방향 d가 각각 서로 공백으로 구분하여 주어진다. 셋째 줄부터 공간이 벽인지 빈 칸인지에 대한 정보가 주어진다.

로봇 청소기가 청소하는 칸의 수를 출력하라.

어떻게 풀 것인가?

전형적인 시뮬레이션 문제이다. 문제에서 요구하는 내용을 오류 없이 성실하게 구현한다.

import pprint

n, m = map(int, input().split())
r, c, d = map(int, input().split())
d = str(d)
arr = []
for _ in range(n):  # 빈칸: 0, 벽: 1, 청소완료: 2
    temp = input()
    arr.append(temp.split(' '))
# pprint.pprint(arr)

direc = ['0', '1', '2', '3']  # 북: 0, 동: 1, 남: 2, 서: 3

flag = 1
while True:
    # 1. 현재 위치를 청소한다.
    if flag == 1:
        arr[r][c] = '2'

    # 2. 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
    if d == '0':
        left = 3
    else:
        left = direc.index(d) - 1

    if (arr[r - 1][c] == '1' or arr[r - 1][c] == '2') and (arr[r][c - 1] == '1' or arr[r][c - 1] == '2')\
            and (arr[r + 1][c] == '1' or arr[r + 1][c] == '2') and (arr[r][c + 1] == '1' or arr[r][c + 1] == '2'):
        if d == '0':  # 바라보는방향: 북
            if arr[r + 1][c] == '1':
                break
            else:
                r = r + 1
        elif d == '1':  # 바라보는방향: 동
            if arr[r][c - 1] == '1':
                break
            else:
                c = c - 1
        elif d == '2':  # 바라보는방향:남
            if arr[r - 1][c] == '1':
                break
            else:
                r = r - 1
        else:  # 바라보는방향: 서
            if arr[r][c + 1] == '1':
                break
            else:
                c = c + 1
        flag = 0
        continue

    # 청소를 해야 하는가?
    if left == 0:  # 왼쪽방향: 북
        if arr[r - 1][c] == '0':
            d = direc[left]  # 회전
            r = r - 1  # 한 칸 전진
            flag = 1  # 청소
        else:  # 벽이거나 이미 청소한 칸
            d = direc[left]  # 회전
            flag = 0
    elif left == 1:  # 왼쪽방향: 동
        if arr[r][c + 1] == '0':
            d = direc[left]  # 회전
            c = c + 1  # 한 칸 전진
            flag = 1  # 청소
        else:  # 벽이거나 이미 청소한 칸
            d = direc[left]  # 회전
            flag = 0
    elif left == 2:  # 왼쪽방향: 남
        if arr[r + 1][c] == '0':
            d = direc[left]  # 회전
            r = r + 1  # 한 칸 전진
            flag = 1  # 청소
        else:  # 벽이거나 이미 청소한 칸
            d = direc[left]  # 회전
            flag = 0
    else:  # 왼쪽방향: 서
        if arr[r][c - 1] == '0':
            d = direc[left]  # 회전
            c = c - 1  # 한 칸 전진
            flag = 1  # 청소
        else:  # 벽이거나 이미 청소한 칸
            d = direc[left]  # 회전
            flag = 0

cnt = 0
for i in range(n):
    for j in range(m):
        if arr[i][j] == '2':
            cnt += 1
print(cnt)

카테고리:

업데이트:

댓글남기기