설모의 기록
[백준 14503] 로봇청소기 본문
이 문제는 로봇청소기가 map을 돌아다니며 얼마만큼의 영역을 청소하는지를 구하는 문제입니다. 로봇청소기가 돌아다니는 조건은 아래와 같습니다.
- 현재 위치를 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽 방향부터 차례대로 탐색을 진행한다.
- 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 수행한다.
- 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
이 문제는 전형적인 dfs 문제입니다. 우선 제가 생각한 규칙입니다.
- dx, dy 배열을 이용해 4방향에 청소할 구역을 탐색해 다시 dfs()을 호출한다.
- 4방향을 모두 탐색한 후 후진을 시도한다.
- 후진이 가능하다면 후진을, 후진이 불가능하다면 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