본문 바로가기
백준알고리즘/DFS 와 BFS

(Python/🥇5)백준알고리즘 14503번: 로봇 청소기

by windy7271 2024. 11. 19.
728x90
반응형

 

문제 바로가기 

문제:

로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 방은 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1 크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표 (r,c)로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 (0,0), 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 (N−1,M−1)이다. 즉, 좌표 (r,c)는 북쪽에서 (r+1)번째에 있는 줄의 서쪽에서 (c+1)번째 칸을 가리킨다. 처음에 빈 칸은 전부 청소되지 않은 상태이다.

로봇 청소기는 다음과 같이 작동한다.

  1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
  2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
    1. 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
    2. 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
  3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
    1. 반시계 방향으로 90'회전한다.
    2. 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
    3. 1번으로 돌아간다.

입력:

첫째 줄에 방의 크기 N M이 입력된다. (3≤N,M≤50)  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 (r,c)와 처음에 로봇 청소기가 바라보는 방향 d가 입력된다. d 0인 경우 북쪽, 1인 경우 동쪽, 2인 경우 남쪽, 3인 경우 서쪽을 바라보고 있는 것이다.

셋째 줄부터 N개의 줄에 각 장소의 상태를 나타내는 N×M개의 값이 한 줄에 M개씩 입력된다. i번째 줄의 j번째 값은 칸 (i,j)의 상태를 나타내며, 이 값이 0인 경우 (i,j)가 청소되지 않은 빈 칸이고, 1인 경우 (i,j)에 벽이 있는 것이다. 방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있다. 로봇 청소기가 있는 칸은 항상 빈 칸이다.

출력:

로봇 청소기가 작동을 시작한 후 작동을 멈출 때까지 청소하는 칸의 개수를 출력한다.

 

풀이:

 

구현 문제인데 

현재 칸의 주변 4칸중 청소되지 않은 빈칸이 있는경우 반시계 회전하고 그대로 진행하는것인데 그것을생각못했다.

만약 한칸 못 가면 고개만 돌린상태로 3번이 똑같이 반복되는 것이다.

 

import sys

# 테스트 입력 파일 경로 설정
sys.stdin = open('/Users/song/Desktop/Python/Python/h.txt', 'r')

# 입력 받기
n, m = map(int, sys.stdin.readline().rstrip().split())
r, c, direction = map(int, sys.stdin.readline().rstrip().split())
graph = [list(map(int, sys.stdin.readline().rstrip().split())) for _ in range(n)]

# 북, 동, 남, 서 방향 정의
move = [(-1, 0), (0, 1), (1, 0), (0, -1)]

# 청소 방문 처리 배열
visited = [[0] * m for _ in range(n)]
visited[r][c] = 1  # 시작 위치 청소

# 청소한 구역 수
res = 1

while True:
    clean = False

    # 현재 방향을 기준으로 반 시계 방향으로 회전하며 탐색
    for i in range(4):
        direction = (direction + 3) % 4  # 반 시계 방향 회전
        nx, ny = r + move[direction][0], c + move[direction][1]

        # 청소하지 않은 구역이 있고, 이동 가능할 때
        if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 0 and visited[nx][ny] == 0:
            visited[nx][ny] = 1  # 청소 표시
            r, c = nx, ny  # 위치 이동
            res += 1  # 청소한 칸 수 증가
            clean = True
            break
    # 네 방향 모두 청소가 되어 있는 경우
    if not clean:
        # 후진 위치 계산
        back_direction = (direction + 2) % 4
        r, c = r + move[back_direction][0], c + move[back_direction][1]

        # 후진했을 때 벽이면 종료
        if graph[r][c] == 1:
            break
# 결과 출력
print(res)

 

 

 

 

방향을 direction % 4 로 체크해준다. 뒤로 후진하는 방향도 마찬가지다

 

 

 

 

반응형

댓글