[Python]알고리즘/백준

[DFS/BFS/완전탐색] ★ 14503번 - 로봇 청소기(BFS/)

HSY_mumu 2022. 4. 5. 00:14
728x90

[백준] 14503번 - 로봇 청소기

풀이 시간: 

 

(풀이1) BFS 이용

1) 문제 해결 아이디어

예전에 이와 거의 비슷한 문제를 푼 적이 있으니 아래글을 참고하자.

[참고] https://hseungyeon.tistory.com/180

 

[구현] 문제5 - 게임 개발

게임 개발 1) 문제 해결 아이디어 전형적인 시뮬레이션 문제 방향을 설정해서 이동하는 문제 유형에서는 dx, dy라는 별도의 리스트를 만들어 방향을 정하는 것이 좋음 2차원 리스트 선언시 리스

hseungyeon.tistory.com

 

첫번째 오류. c, d 조건을 검사하는 경우의 설정 오류

c, d 조건은 4번 회전을 했을경우 검사해야한다.

처음엔 a 조건을 한번이라도 만족하면 break를 하기 때문에 break되지 않고 for문이 끝나면 당연히 4번 회전한 경우이므로 추가적인 조건 없이 바로 c, d 조건을 검사하도록 하였다.

하지만 무슨 이유에서인지 제대로 작동하지 않는 문제가 발생하였고 a 조건을 만족하지 않는 경우 회전횟수(turn)을 1씩 증가시켜 4가 되면 c, d 조건을 검사하도록 하였다.

 

2) 소스코드

from collections import deque

n, m = map(int, input().split())  # 세로, 가로
# d(0: 북, 1: 동, 2: 남, 3: 서)
r, c, d = map(int, input().split())  # 현재 좌표, 방향
# 0: 빈 칸, 1: 벽, 2: 청소한 칸
graph = [list(map(int, input().split())) for _ in range(n)]
# 북, 동, 남, 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# BFS
def bfs(x, y, d):
  res = 0  # 청소한 칸 개수
  queue = deque()
  
  # 시작 위치 삽입, 방문 처리
  queue.append((x, y, d))  
  graph[x][y] = 2  # 방문 처리(청소)
  res += 1    # 청소 칸 개수 1증가
  
  while queue:
    x, y, d = queue.popleft()
    temp_d = d  # 원래 d값 보존을 위해 사용 
    turn = 0    # 연속 회전 횟수
    for i in range(4):
      #nd = ((d + 3) % 4 - i + 4) % 4
      # 현재 좌표&방향 기준 왼쪽 방향&좌표
      nd = (temp_d + 3) % 4
      nx = x + dx[nd]
      ny = y + dy[nd]
      temp_d = nd  # 왼쪽으로 회전한 방향 업데이트

      # 범위 내이고
      if(0 <= nx < n and 0 <= ny < m):
        # a. 청소하지 않은 곳(빈칸)이면
        if(graph[nx][ny] == 0):
          queue.append((nx, ny, nd))  # 삽입(전진)
          graph[nx][ny] = 2  # 방문 처리(청소)
          res += 1  # 청소 칸 개수 1증가
          break  # 1칸 전진한 칸에서 다시 검사하기 위해
        # 벽이나 청소한 칸이면
        else: 
          turn += 1  # 회전 횟수 1 증가
    if(turn == 4):  
      bx = x + dx[(d + 2) % 4] 
      by = y + dy[(d + 2) % 4]
      # d. 4방향 모두 청소가 되있거나 벽이면서 뒤쪽 방향이 벽이라 후진 불가능한 경우 (종료 조건)
      if(graph[bx][by] == 1):
        return res
      # c. 4방향 모두 청소가 되있거나 벽인 경우 
      queue.append((bx, by, d))  # 삽입(후진)

# 현재 위치, 방향에서 호출
print(bfs(r, c, d))

[참고] https://fullmoon1344.tistory.com/108

 

[백준 14503] 로봇 청소기 - Python (구현, 시뮬레이션)

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

fullmoon1344.tistory.com

 

(풀이2) 

1) 문제 해결 아이디어

 

 

 

2) 소스코드

728x90