굥뷰를 햡시댜
[BOJ-14503] 로봇청소기 본문
https://www.acmicpc.net/problem/14503
모 기업 코딩테스트 기출 문제..
시뮬레이션 문제로 그냥 문제에서 하라는대로 구현만 해주면 된다.
비교적 쉬운 난이도였고 나같은 경우는 난독증 + 제 멋대로 해석 때문에 이상한 부분에 핀트가 꽂혀 시간이 오래 걸렸다..
-풀이 방법
1. 입력을 받는다.
2. 로봇청소기가 계속 이동하기 때문에 더이상 이동 불가능할 때 해제해주는 무한루프를 하나 만들어준다.
3. 로봇청소기가 현재 보는 방향의 왼쪽 방향을 순서대로 검사해야하기 때문에 for문으로 4번 반복해서 검사하게 해준다.
4. 현재 바라보는 방향에 따라 왼쪽 방향을 정해주고 그 방향으로 이동시킨다. (이동 불가능할 경우 방향만 바꿔준다)
5. 문제 조건에서 4방향 모두 이동이 불가능할 경우 현재 바라보는 방향을 기준으로 한 칸 뒤로 이동해준다.
6. 무한루프가 걸려있기 때문에 1 ~ 5번을 반복할 것이고 더이상 로봇청소기가 후진이 불가능한 상황이 오면 반복문은 종료된다.
7. clean이라는 배열에 입력된 1의 갯수를 카운트해서 청소한 부분의 갯수를 구하고 출력한다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
struct ROBOT {
int y, x, dir;
};
int n, m;
int clean_cnt;
int map[51][51];
int clean[51][51];
ROBOT robot;
const int dy[] = { -1,1,0,0 };
const int dx[] = { 0,0,-1,1 };
int main(void) {
scanf("%d %d", &n, &m);
scanf("%d %d %d", &robot.y, &robot.x, &robot.dir);
for (int y = 0; y < n; y++) {
for (int x = 0; x < m; x++) {
scanf("%d", &map[y][x]);
}
}
while (1) {
clean[robot.y][robot.x] = 1;
bool flag = false;
for (int i = 0; i < 4; i++) {
if (robot.dir == 0) {
if (map[robot.y][robot.x - 1] == 0 && clean[robot.y][robot.x - 1] == 0) {
flag = true;
robot.dir = 3, robot.x -= 1;
break;
}
else {
robot.dir = 3;
}
}
else if (robot.dir == 1) {
if (map[robot.y - 1][robot.x] == 0 && clean[robot.y - 1][robot.x] == 0) {
flag = true;
robot.dir = 0, robot.y -= 1;
break;
}
else {
robot.dir = 0;
}
}
else if (robot.dir == 2) {
if (map[robot.y][robot.x + 1] == 0 && clean[robot.y][robot.x + 1] == 0) {
flag = true;
robot.dir = 1, robot.x += 1;
break;
}
else {
robot.dir = 1;
}
}
else if (robot.dir == 3) {
if (map[robot.y + 1][robot.x] == 0 && clean[robot.y + 1][robot.x] == 0) {
flag = true;
robot.dir = 2, robot.y += 1;
break;
}
else {
robot.dir = 2;
}
}
}
bool flag2 = false;
if (!flag) {
if (robot.dir == 0) {
if (map[robot.y + 1][robot.x] == 1) {
flag2 = true;
}
else {
robot.y += 1;
}
}
else if (robot.dir == 1) {
if (map[robot.y][robot.x - 1] == 1) {
flag2 = true;
}
else {
robot.x -= 1;
}
}
else if (robot.dir == 2) {
if (map[robot.y - 1][robot.x] == 1) {
flag2 = true;
}
else {
robot.y -= 1;
}
}
else if (robot.dir == 3) {
if (map[robot.y][robot.x + 1] == 1) {
flag2 = true;
}
else {
robot.x += 1;
}
}
}
if (flag2) break;
}
int res = 0;
for (int y = 0; y < n; y++) {
for (int x = 0; x < m; x++) {
if (clean[y][x] == 1) res += 1;
}
}
printf("%d", res);
getchar();
getchar();
return 0;
}
'알고리즘 문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글
[BOJ-14891] 톱니바퀴 (0) | 2019.07.31 |
---|---|
[BOJ-15686] 치킨배달 (0) | 2019.07.26 |
[BOJ-17070] 파이프 옮기기1 (0) | 2019.07.19 |
[BOJ-16236] 아기상어 (0) | 2019.07.18 |
[BOJ-16234] 인구이동 (0) | 2019.07.17 |
Comments