[Baekjoon,14503]로봇 청소기
해결
주어진 로봇의 작동 방식을 그대로 구현하면 된다. 나는 객체로 구현하여 더욱 직관적으로 코드를 작성했다. 다른 방법으로는 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;
}
댓글남기기