tlsdydaud1   1년 전

문제

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

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

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

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


입력

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

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


출력

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

========================================================================================================================

현재 지문과 비교하면 순서도 내용도 꽤 많이 다른데, 지문을 그냥 갈아엎지 않는 이상 좋은 지문은 안 나올 것 같아서 신경 쓰지 않았습니다. 잘못된 부분이 있다면 알려주시면 감사하겠습니다. 만약 잘못된 부분이 없다면, 지문을 교체해 주세요.

jh05013   1년 전

좌표는 0부터 시작합니다.

tlsdydaud1   1년 전

수정했습니다.

hkhkhk5452   1년 전

ㄹㅇ 풀면서도 좀 이상했음

4방향 으로 다보고

왼쪽으로 회전한 다음 후진해야되는지

아님 그대로 후진해야되는지

지문만 읽어서는 절대 모름.

예제 계속 돌리면서 수정해서 맞혔는데

이건 지문 수정하는 게 맞을 듯.

ykang19   1년 전

문제에 쓰여져 있는 지문 보고,

"도대체 어떻게 풀어야 하지?"

한시간 고민하다가 이 글 보고 10분만에 풀었습니다...


지문 바꿔주세요.

tsi03136   1년 전

이 글을 보고 암이 나았습니다..

진짜 지문 바꿔야하는 거 아닌가요!?

shinm0819   1년 전

암이 나았다는게 무슨뜻인지 알겠네요..

근데 한가지 궁금한점은

3번에 '바라보는 방향을 기준으로 앞쪽칸이 청소되지 않은 빈칸인 경우 앞으로 1칸 전진하고, 아니면 앞쪽칸이 청소되지 않은 빈칸일 때까지 반시계방향으로   $90^\circ$   를 도는 것을 반복한다.' 가 되어야 하지 않나요?

tlsdydaud1   1년 전

앞쪽 칸이 청소되지 않았어도 왼쪽을 먼저 보기 때문에 일단 한 번 돌고 나서 돈 후의 방향을 기준으로 앞의 칸을 보아야 합니다.

shinm0819   1년 전

앜 제가 잘못 말했네요

ㅎㅎ

jh05013   1년 전

@startlink

푸는 사람이 매우 많은 문제입니다. 다시 요청드립니다.

startlink   1년 전

수정했습니다.

댓글을 작성하려면 로그인해야 합니다.