짱아의 개발 기록장

[Algorithm] 삼성전자 코딩테스트 - 로봇 청소기(c++) 본문

Algorithm/삼성 sw 역량테스트 기출

[Algorithm] 삼성전자 코딩테스트 - 로봇 청소기(c++)

jungahshin 2020. 9. 23. 00:36
반응형

문제에서 구현하라는 순서대로 쭉 구현하면 되는 간단한 구현문제였다.

구현을 하다가 조건에 맞는 부분, 맞지 않는 부분이 나오면 끊고 다시 돌아가는 부분만 잘 확인하면 된다.

 

 

코드 첨부

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// 로봇 청소기
#include <iostream>
using namespace std;
 
int n, m, r, c, d;
int area[51][51= {0, };
int dx[4= {-1010};
int dy[4= {010-1};
int visited[51][51= {0, }; // 청소한 곳 표시
int ans = 0;
 
void change_dir()
{
    if(d==0){
        d = 3;
    }else if(d==3){
        d = 2;
    }else if(d==2){
        d = 1;
    }else if(d==1){
        d = 0;
    }
}
 
void clean()
{
    int start_x = r;
    int start_y = c;
    bool check = false;
    int num = 0;
 
    while(1){
 
        // 1. 현재 위치 청소
        if(check==false){
            num = 0;
            ans++;
            visited[start_x][start_y] = 1
        }
 
        if(num==4){ // 4방향 모두 청소x->
            num = 0;
            // 한 칸 후진
            if(d==3){
                start_y += 1;
            }else if(d==0){
                start_x += 1;
            }else if(d==1){
                start_y -= 1;
            }else if(d==2){
                start_x -= 1;
            }
 
            if(0>start_x || start_x>=|| 0>start_y || start_y>=|| area[start_x][start_y]==1){
                break;
            }
        }
 
        int temp = d-1;
        if(temp==-1) temp = 3;
        int nx = start_x+dx[temp];
        int ny = start_y+dy[temp];
        
        // 2-a. 왼쪽에 청소를 안했으면 그 방향으로 회전 후, 1번 돌아가
        if(0<=nx && nx<&& 0<=ny && ny<&& !visited[nx][ny] && area[nx][ny]==0){
            //2-a.
            change_dir();
            start_x = nx;
            start_y = ny;
            check = false;
            continue;
        }else{
            // 2-b.
            change_dir();
            check = true;
            num++;
            continue;
        }
    }
}
 
int main()
{
    cin>>n>>m;
    cin>>r>>c>>d;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin>>area[i][j];
        }
    }
 
    clean();
 
    cout<<ans<<"\n";
}
cs

 

문제 첨부

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

 

github 첨부

github.com/jungahshin/algorithm/blob/master/c:c%2B%2B/14503_review_2.cpp

 

jungahshin/algorithm

algorithm study. Contribute to jungahshin/algorithm development by creating an account on GitHub.

github.com

 

반응형
Comments