본문 바로가기
알고리즘 문제풀이/백준

[백준 14503] 로봇 청소기

by m2162003 2020. 12. 17.

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

다른 풀이 보니까 dfs로 푸는 경우도 있지만 그게 더 복잡할꺼 같아서 while문을 사용했다.

 

조건을 잘못 읽어서 처음에 테케도 통과를 못시켰다ㅠ

조건을 잘 보면

1. 현재 위치를 청소

2. 현재 위치에서 왼쪽 방향으로 회전.

2-1. 왼쪽 회전 시에 앞에 청소 안한 칸이 있다면 전진 -> 1

2-2. 청소를 했거나 벽이다. -> 다시 왼쪽 회전

2-3. 4방향 모두 벽 or 청소한 구역 -> 원래 방향에서 후진(청소한 구역도 후진 가능)

2-4. 후진하는 방향이 벽이라면 작동을 멈춤

 

처음에 2-3.에서 후진할 경우 청소한 구역도 후진이 가능하다는 조건을 빼먹었다. ㅠㅡㅠ

 

dirr과 dirc자체를 d=0일때 왼쪽 회전해서 전진하는 좌표값으로 넣어놨다.

그래서 4번 회전하며 다음 칸이 청소안한 구역이면 현재 위치와 방향을 변경한다.

 

4번 회전해서 제자리라면 (flag = false) 후진하여 벽인지 확인한다.

벽이면 while을 종료 그렇지 않으면 현재 위치만 변경하여 다시 진행한다.

#include <stdio.h>

using namespace std;

int n, m;
int r, c, d;
int arr[50][50];

int dirr[4] = {0, -1, 0, 1};
int dirc[4] = {-1, 0, 1, 0};

int backr[4] = {1, 0, -1, 0};
int backc[4] = {0, -1, 0, 1};

int main(void)
{
  scanf("%d%d", &n, &m);
  scanf("%d%d%d", &r, &c, &d);
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < m; j++)
    {
      scanf("%d", &arr[i][j]);
    }
  }
  int cnt = 0;
  while (1)
  {

    if (arr[r][c] == 0)
    {
      arr[r][c] = -1;
      cnt++;
    }

    bool flag = false;
    for (int i = 0; i < 4; i++)
    {
      int nextR = r + dirr[d];
      int nextC = c + dirc[d];
      int nextD = d - 1 < 0 ? 3 : d - 1;

      if (arr[nextR][nextC] == 0)
      {
        flag = true;
        r = nextR, c = nextC, d = nextD;
        break;
      }

      d = nextD;
    }

    if (flag)
    {
      continue;
    }

    int backR = r + backr[d];
    int backC = c + backc[d];

    if (arr[backR][backC] == 1)
    {
      break;
    }
    r = backR;
    c = backC;
  }
  printf("%d\n", cnt);
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 6064] 카잉 달력  (0) 2020.12.18
[백준 15684] 사다리 조작  (0) 2020.12.17
[백준 14499] 주사위 굴리기  (0) 2020.12.17
[백준 15686] 치킨 배달  (0) 2020.12.16
[백준 15683] 감시  (0) 2020.12.16

댓글