본문 바로가기
Computer Science/Algorithm

[백준] 14503 - 로봇 청소기 (Python) (C++)

by 수제햄버거 2021. 7. 19.
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;
}
반응형