[Baekjoon,14503]로봇 청소기

1 분 소요

해결

주어진 로봇의 작동 방식을 그대로 구현하면 된다. 나는 객체로 구현하여 더욱 직관적으로 코드를 작성했다. 다른 방법으로는 DFS를 이용하여 유셩장 블로그처럼 재귀적으로도 구현할 수 있다.

구현 시 현재 좌표를 Pos라는 객체로 만들어 표현했고, 이를 map container의 key로 이용하여 위치에 대한 정보를 저장했다. 이때 map은 균형 이진 트리로서 탐색시 < 연산자를 요구하기 때문에 이 연산자를 오버로딩 해야 한다.

#include <iostream>
#include <map>
using namespace std;

const int MAX=50;
const int dx[4]={0,1,0,-1};
const int dy[4]={-1,0,1,0};

enum{ DIRTY, WALL, CLEANED };
enum{ UP, RIGHT, DOWN, LEFT };

int H,W;

class Pos
{
private:
    int y,x;
public:
    Pos(int _y, int _x) : y(_y), x(_x) { }
    Pos operator+(const Pos& rhs) const 
    {
        return Pos(y+rhs.y, x+rhs.x);
    }
    // map<> 의 key로 이용하기 위한 연산자 
    bool operator<(const Pos& rhs) const
    {
        if(y!=rhs.y) 
            return y<rhs.y;
        return x<rhs.x;
    }
};

map<Pos,int> house;

class Robot
{
private:
    Pos curPos;
    int dir;
    int amountCleaned;
public:
    Robot(Pos _pos, int _dir) : curPos(_pos), dir(_dir), amountCleaned(0) { }
    // 왼쪽 방향으로 회전
    void turn()
    {
        dir=(dir==UP) ? LEFT : dir-1;
    }
    // 작동이 불가능 하면 false를 반환한다.
    bool move()
    {
        // 현재 위치를 청소한다.
        if(house[curPos]==DIRTY)
        {
            house[curPos]=CLEANED;
            ++amountCleaned;
        }
        // 다음 위치를 찾는다.
        for(int i=0;i<4;++i)
        {
            turn();
            Pos nextPos(curPos+Pos(dy[dir],dx[dir]));
            // 왼쪽이 더러우면 이동한다.
            if(house[nextPos]==DIRTY)
            {
                curPos=nextPos;
                return true;
            }
        }
        // 더러운 공간이 없다면 뒤를 확인한다.
        turn(); turn();
        Pos nextPos(curPos+Pos(dy[dir],dx[dir]));
        if(house[nextPos]==CLEANED)
        {
            // 뒤로 이동하고 바라 보는 방향을 원래대로 돌린다.
            curPos=nextPos;
            turn(); turn();
            return true;
        }
        // 뒤가 벽이면 작동이 불가능하다.
        return false;
    }
    int amount() const 
    {
        return amountCleaned;
    }
};

int main()
{
    cin>>H>>W;
    int y,x,dir;
    
    cin>>y>>x>>dir;
    
    for(int i=0;i<H;++i)
        for(int j=0;j<W;++j)
        {
            int state;
            cin>>state;
            house[Pos(i,j)]=state;
        }
    
    Robot robot(Pos(y,x),dir);
    int ret=0;
    while(robot.move());
    cout<<robot.amount()<<endl;
    
    return 0;
}

댓글남기기