본문 바로가기
Programming/Algorithm

백준 14503 로봇 청소기

by OKOK 2017. 10. 20.

#include <iostream>

#define MAX 51

using namespace std;


int map[MAX][MAX];

int m, n;

int x, y, d;

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

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


void input() {

scanf("%d %d", &n, &m);

scanf("%d %d %d", &x, &y, &d);


for (int i = 0; i < n; i++)

for (int j = 0; j < m; j++)

scanf("%d", &map[i][j]);

}


int turn(int now, int next) {

if (next == 0){

if (now == 0) return 3;

else if (now == 1) return 0;

else if (now == 2) return 1;

else return 2;

}

else return (now + 2) % 4;

}


void process() {

int cnt = 0;

int ret = 1;

map[x][y] = 2;

int nx;

int ny;


while (1) {

if (cnt == 4)

{

d = turn(d, 1);

nx = x + dx[d];

ny = y + dy[d];

if (nx < 0 || ny < 0 || nx >= n || ny >= m || map[nx][ny] == 1)

break;


x = nx;

y = ny;

d = turn(d, 1);

cnt = 0;

}


d = turn(d, 0);

nx = x + dx[d];

ny = y + dy[d];

cnt++;

if (nx < 0 || ny < 0 || nx >= n || ny >= m || map[nx][ny] != 0)

continue;


x = nx;

y = ny;


map[x][y] = 2;

ret++;

cnt = 0;

}

printf("%d\n", ret);

}


int main() {

input();

process();

return 0;


인풋 함수, 방향 전환 함수, 과정함수, 메인 함수

과정함수에서 cnt 를 중심으로 while 문을 돌립니다. 맵을 벗어나면 와일문을 벗어나거나, 아래 명령어들을 무시합니다. cnt는  한번 회전할때마다 올려줍니다. 그리고 맵이 칠해지면 cnt는 다시 0으로 변합니다. 방향 전환 후, 이동을 하게 되면  맵을 벗어나는지 확인하는 작업이 필요합니다. 전체 적인 while 문을 구성. 가장 큰 틀을 짜는 것이 중요합니다. 


문제의 한 줄 한 줄을 모두 구현하는 것이 중요합니다. 다른 조건들을 놓치지 않고, 처음 칠해진 다는 사실, 처음 북쪽을 향한다는 사실, 회전 방향의 순서가 주어진다는 사실.