📊알고리즘, 문제풀이/📈문제풀이 (PS)

[알고리즘][Python] 백준 14503 로봇 청소기 문제 풀이

Written by Donghak Park

문제 출처 : www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net


문제 해석 : 로봇 청소기가 특정한 조건을 만족하면서 청소를 진행한다. 이때 청소가 완료된 횟수를 출력하는 문제이다.

 

문제 풀이 : 주어진 문제의 조건을 하나씩 차근차근 따져가면서 풀면 해결할 수 있다. 


풀이 코드

from collections import deque

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]


def solution():
    global arr
    result = arr

    answer = 0
    Q = deque()
    Q.append([R, C, D, 0])

    while Q:
        x, y, d, count = Q.popleft()

        if arr[x][y] != 2:
            answer += 1
            arr[x][y] = 2

        nd = (d - 1) % 4
        nx = x + dx[nd]
        ny = y + dy[nd]

        if 0 <= nx < N and 0 <= ny < M:
            if arr[nx][ny] == 0:
                Q.append([nx, ny, nd, 0])

            elif arr[nx][ny] == 2 or arr[nx][ny] == 1:
                Q.append([x, y, nd, count + 1])

        if count == 4:
            nx = x - dx[d]
            ny = y - dy[d]

            if 0 <= nx < N and 0 <= ny < M:
                if arr[nx][ny] == 1:
                    return answer
                else:
                    Q.append([nx, ny, d, 0])

if __name__ == "__main__":
    N, M = map(int, input().split())

    R, C, D = map(int, input().split())
    # 북, 동, 남, 서

    arr = [list(map(int, input().split())) for _ in range(N)]

    print(solution())

author : donghak park
contact : donghark03@naver.com

## 문제의 저작권은 백준 알고리즘 사이트에 있습니다. 혹시 문제가 되는 부분이 있으면 연락 바랍니다.