동캄의 코딩도장

백준 14503 [로봇 청소기] 파이썬 본문

코테/BOJ

백준 14503 [로봇 청소기] 파이썬

동 캄 2022. 5. 18. 10:13

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

# 백준 14503 로봇 청소기
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
dr = [-1, 0, 1, 0]
dc = [0, 1, 0, -1]
N, M = map(int, input().split())
curr_r, curr_c, direc = map(int, input().split())
field = []
for _ in range(N):
    field.append(list(map(int, input().split())))
visited = [[0]*(M) for _ in range(N)]


def search(row, col, direc, cnt, stack):
    if stack == 4:
        back_r = row+dr[(direc-2) % 4]
        back_c = col+dc[(direc-2) % 4]
        if field[back_r][back_c] == 1:
            print(cnt)
            return
        elif field[back_r][back_c] == 0:
            stack = 0
            search(back_r, back_c, direc, cnt, stack)
    else:
        direc -= 1
        R = row+dr[direc % 4]
        C = col+dc[direc % 4]
        if visited[R][C] == 0 and field[R][C] == 0:
            stack = 0
            visited[R][C] = 1
            cnt += 1
            search(R, C, direc, cnt, stack)
        else:
            stack += 1
            search(row, col, direc, cnt, stack)


cnt = 1
stack = 0
direc += 10000
visited[curr_r][curr_c] = 1
search(curr_r, curr_c, direc, cnt, stack)

dfs bfs 비슷한 문제이다.

문제에서 주어진 조건에 맞게 코드를 구현해주면 된다.