NxM 전체 맵 크기 r : row, c : col (3~50)
청소기 방향 d : 0 북쪽 1 동쪽 2 남쪽 3 서쪽
맵 정보 : 0 빈칸 1 벽
벽을 통과할 수 없음, 한번 청소한 곳은 또 청소하지 않음
input_1 N,M 입력받기
input_2 청소기의 정보 (r,c) d 입력받기
input_3 초기 맵의 정보 Map[N][M] 입력받기
청소기 동작 조건에 맞춰서 시뮬레이션 진행하기
로봇 청소기가 청소한 구역의 개수(res) 구하기
output res 출력하기
#include <iostream>
using namespace std;
struct loc{
int r,c,d;
};
int N,M;
int Map[50][50];
loc robot;
int Dr[4] = {-1,0,1,0};
int Dc[4] = {0,1,0,-1};
int solve(){
int res = 0;
bool visited[50][50] = {false};
int nr = robot.r, nc = robot.c, dir = robot.d;
int cnt = 0;
//현재 위치 청소
visited[nr][nc] = true;
do{
if(cnt ==4){
cnt = 0;
nr -= Dr[dir];
nc -= Dc[dir];
if(nc < 0 || nr < 0 || nr > N-1 || nc > M-1) break;
if(Map[nr][nc] == 1) break;
continue;
}
//왼쪽 방향에 청소x공간 존재
dir = (dir+3)%4;
nr += Dr[dir];
nc += Dc[dir];
cnt++;
//왼쪽 방향에 청소x공간 존재x
if(Map[nr][nc] == 1 || visited[nr][nc]){
nr -= Dr[dir];
nc -= Dc[dir];
continue;
}
if(nc < 0 || nr < 0 || nr > N-1 || nc > M-1){
nr -= Dr[dir];
nc -= Dc[dir];
continue;
}
//왼쪽 방향에 청소x공간 존재
visited[nr][nc] = true;
cnt = 0;
}while(1);
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
if(Map[i][j] != 1 && visited[i][j] == true) res++;
return res;
}
int main()
{
cin >> N >> M;
int a,b,c;
cin >> a >> b >> c;
robot = {a,b,c};
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
cin >> Map[i][j];
cout << solve() << endl;
return 0;
}
버전_2_0605
#include <iostream>
using namespace std;
struct loc{
int r,c,d;
};
int N,M;
loc rot;
int Map[50][50];
int Dr[4] = {-1,0,1,0};
int Dc[4] = {0,1,0,-1};
int solve(){
int res,cnt = 0;
int nr = rot.r, nc = rot.c, nd = rot.d;
Map[nr][nc] = 9;
res++;
while(1){
if(cnt==4){
cnt = 0;
nr -= Dr[nd];
nc -= Dc[nd];
if(Map[nr][nc]==1) break;
continue;
}
nd = (nd+3)%4;
nr += Dr[nd];
nc += Dc[nd];
cnt++;
if(Map[nr][nc]==1||Map[nr][nc]==9||nc<0||nr<0||nc>M-1||nr>N-1){
nr -= Dr[nd];
nc -= Dc[nd];
if(nc < 0 || nr < 0 || nr > N-1 || nc > M-1) break;
if(Map[nr][nc]==1) break;
continue;
}
Map[nr][nc] = 9;
res++;
cnt = 0;
}
return res;
}
int main()
{
cin >> N >> M;
cin >> rot.r >> rot.c >> rot.d;
for(int i = 0; i < N; i++)
for(int j = 0; j < M; j++)
cin >> Map[i][j];
cout << solve() <<endl;
return 0;
}
문제 난이도는 쉬운데 막상 코드로 구현해보면 동작이 복잡하다고 생각이 듦
방향을 바꾸는 거나 전진, 그대로, 후진하는 상황이 헷갈렸음
또 가장자리가 벽으로 둘러쌓여 있어 범위 체크할 필요가 없다고 생각했는데, 동작하다보면 범위를 넘어갈 수 가 있었음 이런 경우 무한 루프에 빠져서 runtime error가 발생했음