문제풀이/백준oj
[백준OJ] 14503번 로봇 청소기
Hyeon-Uk
2021. 4. 24. 02:51
반응형
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
-풀이-
문제에 나온대로했지만, 순서를 다르게했다.
먼저 자기자리를 청소한뒤,
첫번째로 a를 체크하고, 두번째론 d, 세번째론 c, 네번째론 b를 if-elseif로 체크해가면서 로직을 실행시켰다.
a,b,c,d,순서대로 조건을 검사하게된다면, 사방이 전부 벽이거나 청소한 구간일때, 청소기는 무한으로 돌기만하고 끝날것이고, c다음으로 d를 검사하면, 네방향이 벽인경우에 무조건 후진을 하는 c에 걸리기 때문이다.
-시간복잡도-
로봇청소기가 전부 다 뽈뽈 돌아다니는것이 최악이므로 O(N*M)이 된다.
-코드-
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int maze[50][50];
int n, m,d;
int mv[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };
pair<int, int> c;
void input() {
cin >> n >> m;
cin >> c.first >> c.second >> d;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> maze[i][j];
}
}
}
bool check(int x, int y) {
if ((maze[x + 1][y] == -1||maze[x+1][y]==1) && (maze[x - 1][y] == -1|| maze[x - 1][y] == 1)
&& (maze[x][y + 1] == -1|| maze[x][y + 1] == 1) && (maze[x][y - 1] == -1|| maze[x][y - 1] == 1)) {
return true;
}
else {
return false;
}
}
void solve() {
while (true) {
maze[c.first][c.second] = -1;
if (maze[c.first + mv[d == 0 ? 3 : d-1][0]][c.second + mv[d == 0 ? 3 : d-1][1]] == 0) {
d == 0 ? d = 3 : d--;
c.first = c.first + mv[d][0];
c.second = c.second + mv[d][1];
}
else if (check(c.first, c.second) && maze[c.first+mv[(d+2)%4][0]][c.second+mv[(d+2)%4][1]]==1) {
break;
}
else if (check(c.first, c.second)) {
c.first = c.first + mv[(d + 2) % 4][0];
c.second = c.second + mv[(d + 2) % 4][1];
}
else if (maze[c.first + mv[d == 0 ? 3 : d-1][0]][c.second + mv[d == 0 ? 3 : d-1][1]] != 0) {
d == 0 ? d = 3 : d--;
}
}
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (maze[i][j] == -1) cnt++;
}
}
cout << cnt << "\n";
}
int main(){
input();
solve();
}
반응형