728x90
반응형
문제 출처:
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
문제 풀이 :
- 전형적인 구현문제로 그냥 문제를 이해하고 구현하기만 하면된다.
- 이런 문제를 풀때 팁은 각각의 동작을 함수로 구현해서 각 동작들이 잘 작동하는지 확인하고 최종적으로 함수의 위치만 잘 사용하면 되는데 나는 귀찮아서 통으로 코딩하긴 하였다..
n,m = map(int,input().split())
robot = list(map(int,input().split()))
maps = [list(map(int,input().split())) for _ in range(n)]
dr = [-1,0,1,0]
dc = [0,1,0,-1]
turn_dir = [3,0,1,2]
r,c,d = robot
check_cnt =0
while(True):
#현재위치청소
if(maps[r][c]==0):
maps[r][c]=9
#왼쪽부터탐색
nd = turn_dir[d]
nr = r+dr[nd]
nc = c+dc[nd]
#맵 넘음 --> 청소할 곳 없네?
if(nr<0 or nr>=n or nc<0 or nc>=m):
check_cnt+=1
d= nd
else:
#청소할 공간있네?
if(maps[nr][nc]==0):
r = nr
c = nc
d = nd
maps[nr][nc]=9
check_cnt=0
else:
#청소할 공간없네?
d=nd
check_cnt+=1
if(check_cnt==4):
#4방향 다 안되네?
back_r = r-dr[d]
back_c = c-dc[d]
if (back_r < 0 or back_r >= n or back_c < 0 or back_c >= m or maps[back_r][back_c]==1):
break
else:
r=back_r
c=back_c
check_cnt=0
ans=0
for i in range(n):
for j in range(m):
if(maps[i][j]==9):
ans+=1
print(ans)
cf) C++
#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;
}
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
Softeer [인증평가(4차) 기출] 슈퍼컴퓨터 클러스터 (Python) (2) | 2022.09.22 |
---|---|
[Softeer] [인증평가(3차) 기출] 플레이페어 암호 (Python) (0) | 2022.09.02 |
[백준] 14502 - 연구소 (Python) (0) | 2021.07.19 |
[프로그래머스] 순위 검색 (Level2) (Python) (0) | 2021.07.11 |
[백준] 14888 - 연산자 끼워넣기 (Python) (0) | 2021.07.11 |