본문 바로가기
ALGORITHM/BAEKJOON

[BOJ/Python] 14503. 로봇 청소기

by 안녕나는현서 2021. 10. 13.
728x90

📌 문제

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

📌 문제 접근 방법

  1. 바보같이 문제 파악을 잘 못해서 어어어어엄청 헤맸다😣
    문제를 찬찬히 살펴보자면,
    1) 현재 위치를 청소한다.
    2) 현재 위치에서 왼쪽 방향부터 차례로 인접한 칸을 탐색한다.
    2-1) 청소할 공간이 있다면, 해당 방향(청소할 공간의 방향)으로 회전하여 전진한다.
    2-2) 네 방향 모두 청소할 수 없다면, 바라보는 방향(마지막으로 탐색한 방향)을 유지한 채로 후진한다.
  2. 재귀를 활용한 dfs로 풀이하였다.
  3. 방향이 왼쪽으로 돌아간다는 점만 헷갈리지 않고 바꿔주면 된다!

 

📌 코드

# 백준 14503 로봇 청소기

def dfs(x, y, d):
    global cnt

    # 현재 위치 청소
    if place[x][y] == 0:
        place[x][y] = 2
        cnt += 1

    left = d
    for _ in range(4):
        # 왼쪽 방향부터 차례로 인접한 칸 탐색
        left = (left+3)%4
        nx, ny = x+dxy[left][0], y+dxy[left][1]

        # 청소할 공간이 있다면,
        if place[nx][ny] == 0:
            dfs(nx, ny, left)
            return

    # 네 방향 모두 청소할 수 없다면,
    bx, by = x-dxy[left][0], y-dxy[left][1]

    if place[bx][by] != 1:
        dfs(bx, by, left)


N, M = map(int, input().split())
# d -> 0 : 북(-서) , 1 : 동쪽(-북), 2 : 남쪽(-동), 3 : 서쪽(-남)
r, c, d = map(int, input().split())
place = [list(map(int, input().split())) for _ in range(N)]

# 북동남서
dxy = [(-1, 0), (0, 1), (1, 0), (0, -1)]
cnt = 0
dfs(r, c, d)

print(cnt)
728x90

'ALGORITHM > BAEKJOON' 카테고리의 다른 글

[BOJ/Python] 14981. 톱니바퀴  (0) 2021.10.14
[BOJ/Python] 17471. 게리맨더링  (0) 2021.10.13
[BOJ/Python] 5556. 타일  (0) 2021.10.09
[BOJ/Python] 2579. 계단 오르기  (0) 2021.10.08
[BOJ/Python] 1208. 부분수열의 합2  (0) 2021.10.08

댓글