설모의 기록

[백준 14503] 로봇청소기 본문

알고리즘

[백준 14503] 로봇청소기

HA_Kwon 2018. 4. 14. 19:21

이 문제는 로봇청소기가 map을 돌아다니며 얼마만큼의 영역을 청소하는지를 구하는 문제입니다. 로봇청소기가 돌아다니는 조건은 아래와 같습니다.


  1. 현재 위치를 청소한다.
  2. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 탐색을 진행한다.
    1. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 수행한다.
    2. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
    3. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
    4. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.

 이 문제는 전형적인 dfs 문제입니다. 우선 제가 생각한 규칙입니다.

  1. dx, dy 배열을 이용해 4방향에 청소할 구역을 탐색해 다시 dfs()을 호출한다.
  2. 4방향을 모두 탐색한 후 후진을 시도한다.
  3. 후진이 가능하다면 후진을, 후진이 불가능하다면 dfs를 마친다.

 처음에는 한방향씩 돌면서 후진이 가능한 곳이 있는지를 체크해야하나.. 하는 생각에 잡혀 있었는데, 문제는 처음 dfs 의 인자로 받은 방향에서 후진이 가능한지를 체크하는 문제였습니다. 따라서 4방향에서 후진이 가능한지를 체크할 필요가 없었어요!
 제가 설정한 dx, dy의 각각의 요소는 0(북), 1(동), 2(남), 3(서) 방향별로 전진할 때 더할 값입니다. 예를 들어, 로봇청소기가 동쪽을 바라보고 있을 때의 왼쪽이면 북쪽이죠? 그래서 dx[0], dy[0] 를 이용해 다음 좌표를 구합니다. 
 그리고 dfs의 for문에서 다음 청소할 구역을 구했다면 dfs를 호출한 후 return 을 해야합니다. 그렇지 않으면 로봇 청소기가 다른 방향으로 가서 청소를 하다가 후진할 곳이 없어서 끝났는데, 다시 이 for 문에서의 위치로 돌아와 회전하면서 청소를 나아간다는게 말이 안되죠. 순간이동이니까요!


'알고리즘' 카테고리의 다른 글

[백준 14501] 퇴사  (0) 2018.04.15
[백준 14502] 연구소  (0) 2018.04.14
[백준 14890] 경사로  (3) 2018.04.12
[백준 14891] 톱니바퀴  (2) 2018.04.11
[codeground 연습문제 4] 다트게임  (0) 2018.04.10
Comments