BOJ
BOJ::14503 로봇 청소기
BOJ Gold 5
BOJ::14503 로봇 청소기
- Link : BOJ::14503
- Level : Gold 5
- tag : implementation, simulation
시사점
- 실수한 부분을 찾느라 시간을 매우 소모하였습니다.
- r, c로 입력이 주어집니다.
- r은 북쪽으로부터 떨어진 거리, c는 서쪽으로부터 떨어진 거리입니다.
- 즉, 0부터 시작합니다.
이해(3)
- 주어진대로 구현합니다.
- 설명이 조금 애매한 부분이있습니다.
- c 에서 ‘네 방향 모두 청소가 되어있거나 벽인 경우에는’
- 네 ‘탐색’ 공간 모두 청소가 되어있거나 벽인 경우에는 으로
- 변경하여야 문제의 일관성을 통해 이해가 쉽게 될 것 같습니다.
설계, 손 코딩(4)
- 손으로 중심이 되는 코드를 구현합니다.
- 4방향 모두 확인하여도 가능한 곳이 없는 경우엔,
- 처음 바라보는 방향과 같은 방향으로 해당 for문을 빠져나와야 합니다.
복잡도
구현(15)
#include<bits/stdc++.h>
#define endl '\n'
#define rep(i,a,b) for(int i=a;i<b;i++)
#define r_rep(i,a,b) for(int i=a;i>b;i--)
#define WALL 1
const int MAXNM = 50 + 4;
const int dx[]={-1, 0, 1, 0}, dy[]={0, 1, 0, -1};
const int LE[]={3, 0, 1, 2};
using namespace std;
int n, m;
int x, y, d;
int a[MAXNM][MAXNM];
bool seen[MAXNM][MAXNM];
void input(){
cin >> n >> m >> x >> y >> d;
x+=1, y+=1;
rep(i, 0, n + 2){
rep(j, 0, m + 2){
if(i == 0 || j == 0 || i == n+1 || j == m+1){
seen[i][j] = true;
continue;
}
cin >> a[i][j];
if(a[i][j]) seen[i][j] = true;
}
}
}
void process(){
input();
int ans = 1;
seen[x][y] = true;
while(true){
bool found = false;
rep(i, 0, 4){
d = LE[d];
int nx = x+dx[d], ny = y+dy[d];
if(seen[nx][ny] || a[nx][ny]) continue;
seen[nx][ny] = true;
found = true;
ans++;
x = nx, y = ny;
break;
}
if(!found){
int nx = x-dx[d], ny = y-dy[d];
if(a[nx][ny] == WALL) break;
x = nx, y = ny;
}
}
cout << ans << endl;
}
int main(){
freopen("input.txt", "r", stdin);
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
process();
return 0;
}
디버깅(20)
- (20m) : 실수를 하여 시간을 많이 소모하였습니다.
- r, c로 입력이 주어집니다.
- r은 북쪽으로부터 떨어진 거리, c는 서쪽으로부터 떨어진 거리입니다.
- 즉, 0부터 시작합니다.
- 1부터 시작하는 것으로 착각하였습니다.