14503번: 로봇 청소기

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

www.acmicpc.net

 

<내 코드>

 

import collections

# 북, 동, 남, 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]


def change(d):
    if d == 0:  # 북 -> 서
        return 3
    elif d == 1:  # 동 -> 북
        return 0
    elif d == 2:  # 남 -> 동
        return 1
    elif d == 3:  # 서 -> 동
        return 2


def search(x, y, d):
    cnt = 1
    q = collections.deque([[x, y, d]])
    route[x][y] = 2

    while q:
        x, y, d = q.popleft()
        nd = d

        for i in range(4):
            # 왼쪽 영역 탐색
            nd = change(nd)
            nx = x + dx[nd]
            ny = y + dy[nd]

            # a
            if 0 <= nx < N and 0 <= ny < M and route[nx][ny] == 0:
                cnt += 1
                route[nx][ny] = 2
                q.append([nx, ny, nd])
                break
            # c
            elif i == 3:

                if d == 0:
                    x += 1
                elif d == 1:
                    y -= 1
                elif d == 2:
                    x -= 1
                elif d == 3:
                    y += 1
                q.append([x, y, d])
                # d
                if route[x][y] == 1:
                    return cnt


N, M = map(int, input().split())
r, c, d = map(int, input().split())

route = [list(map(int, input().split())) for _ in range(N)]
print(search(r, c, d))

 

  • 방향을 북, 동, 남, 서 방향으로 바꿔줘야 한다

  • 벽인지, 빈칸인지를 잘 구별해주어야 한다

  • 후진을 할 방향을 잘 선택해주면 된다

 

 

반응형

+ Recent posts