Computer Science/Algorithm
[백준] 14504 - 로봇청소기 (C++)
수제햄버거
2021. 1. 25. 12:38
728x90
반응형
문제 출처 :
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
문제 풀이:
[백준] 14504 - 로봇청소기 (Python)
문제 출처 : acmicpc.net/problem/14503 14503번: 로봇 청소기 로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로
jinu0418.tistory.com
- python 풀이와 같은 로직으로 풀었다.
- 역시나 C++ 답게 속도면에서 월등히 빠르다. python으로 푼 경우 pypy3을 이용해서 제출햇을때도 메모리가 121800KB , 시간 156m 가 소요되었는데 C++의 경우 2016KB, 0ms로 풀렸다.
#include <iostream>
using namespace std;
void print_map(int map[51][51],int n,int m)
{
for(int i=0;i<n;i++)
{
for(int j =0; j<m;j++)
{
cout << map[i][j]<<" ";
}
cout <<"\n";
}
}
int main(){
int n,m;
int r,c,d;
int map[51][51];
int ans =0;
int dr[4] ={-1,0,1,0};
int dc[4] ={0,1,0,-1};
int turn_dir[4] = {3,0,1,2};
int check_cnt =0;
cin >> n>>m;
cin >> r>>c>>d;
for(int i=0;i<n;i++)
{
for(int j =0; j<m;j++)
{
int temp=0;
cin >>temp;
map[i][j]=temp;
}
}
//print_map(map,n,m);
int nd,nr,nc;
int back_r,back_c;
while(true){
//현재 위치가 청소되어있지 않으면 청소하기
if(map[r][c]==0) {
map[r][c] = 9;
ans++;
}
//방향 바꿔서 탐색 시작
nd = turn_dir[d];
nr = r + dr[nd];
nc = c + dc[nd];
//맵 범위내에 존재해야함
if(nr<0 || nr>=n || nc<0 || nc>=m)
{
check_cnt++;
d = nd;
}
else
{
//갈 위치가 청소 할 수 있는 경우
if(map[nr][nc]==0)
{
r= nr;
c= nc;
d= nd;
//해당 위치로 이동하고 청소
map[nr][nc]=9;
ans++;
check_cnt=0;
}
else
{
d=nd;
check_cnt++;
}
}
if(check_cnt==4) {
//4방향이 모두 안되는 경우
back_r = r - dr[d];
back_c = c - dc[d];
if (back_r < 0 || back_r >= n || back_c < 0 || back_c >= m || map[back_r][back_c] == 1) {
break;
} else {
r = back_r;
c = back_c;
check_cnt = 0;
}
}
}
cout << ans;
return 0;
}
반응형