[C++] 백준 14503 - 로봇 청소기

🔐 백준 14503 - 로봇 청소기

https://www.acmicpc.net/problem/14503


🔑 풀이

시뮬레이션 문제를 보았을 때, 중요한 것은 문제의 조건과 입력 등을 정확히 이해하는 것이라고

생각한다. 우선 방의 크기는 $ N \times M $ 이며, 제일 처음 좌표는 (0, 0) 부터 시작한다.

보통 시뮬레이션 문제의 경우 여러 기능들을 각각의 함수로 짜는 것이 가독성이 좋고 편할때가 많았다.

따라서, 이 문제에서 로봇 청소기의 작동 순서를 다음과 같이 정리해보면,

1. 현재 칸 청소 X -> 현재 칸 청소 (청소한 칸 개수 +1)

2. 주변 4칸(동서남북)이 모두 깨끗하다면

  2-1. 현재 방향을 유지하고, 후진 가능하다면 후진 -> 1번으로
  2-2. 후진 불가능하다면(벽) 종료

3. 주변 4칸 중 더러운 칸이 존재한다면 반시계 방향으로 90도 회전

4. 현재 방향 기준 앞 칸이 더러운 칸이라면 한 칸 전진

5. 1번으로 돌아감

이제 차근차근 위의 알고리즘대로 코드를 짜면 된다. 우선 주변 4칸을 확인해주는 함수인

isDirty() 함수를 만들어 주었고, 남은 작동은 operation() 함수로 구현해주었다.

로봇 청소기의 작동이 멈출때까지, 즉 2-2의 상황이 될 때까지 동작해야 하므로,

무한 루프로 감싸주고, 종료 조건을 설정해주었다. 또한, 후진이 가능한지를 확인할 때,

현재 방향의 반대를 구하기 위해 int backDir = (dir + 2) % 4; 와 같이 구현하여

후진한 칸을 확인해주는 방식으로 구현했지만, 이보다 더 간단하게 현재 좌표에서

현재 방향만큼을 빼주는 것으로 구현할 수도 있다. (x - dx[dir], y - dy[dir])


🧩 코드

Categories:

Updated:

Leave a comment