Be a developer

백준 14503 로봇 청소기 본문

sw 역량테스트

백준 14503 로봇 청소기

중국고대사 2019. 4. 16. 02:26

코딩 테스트 치러가기 전에 풀다가 2일 뒤인 오늘 마저 풀게 된 문제이다..

무슨 정신상태로 했는지 코드가 엉망진창이었다.

 

시뮬레이션 문제답게 조건만 맞춰주면 되는 문제이다.

다만 신경쓸 것은 방향이 주어지기 때문에 그에 맞춰서 dr, dc 배열을 선언해주면 편하다. 또한 dir을 바꿀 때 % 연산자를 통해서 쉽게 변경하는 것도 쉽게 문제를 푸는 방법이다. 자주 쓰이는 방법인 것 같다.

 

그리고 scanf로 계속 입력을 받았는데, cin과 cout을 좀 더 쓰도록 노력해야 겠다. 쓰는 방법을 잘 익히고 있어야 될 것 같다.

 

아래는 코드이다.

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
#include <iostream>
using namespace std;
 
//북, 동, 남, 서 방향(idx)
int dr[4= { -1,0,1,0 };
int dc[4= { 0,1,0,-1 };
 
int n, m, ans;
//현재 청소기의 위치와 방향을 저장
int r, c, d;
//0,0부터 시작하니까 50,50으로 잡아도 된다.
int map[50][50];
bool visit[50][50];
 
int main(int argc, char** argv) {
    cin >> n >> m;
    cin >> r >> c >> d;
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d"&map[i][j]);
        }
    }
 
    while (1) {
        //방문하지 않았고, 벽이 아니라면 check(청소)한다. 
        if (!visit[r][c] && map[r][c] != 1) {
            visit[r][c] = true;
            ans++;
        }
        int ok = false;
        //사방이 모두 갈 수 없는 곳임을 체크하기 위한 값이다.
        int cnt = 0;
        while (cnt != 4) {
            cnt++;
            //현재 방향의 왼쪽 방향으로 d를 바꿔준다.
            int nd = (d + 3) % 4;
            int nr = r + dr[nd];
            int nc = c + dc[nd];
            //왼쪽이 청소할 공간이 없다면 회전한다.
            if (nr < 0 || nr >= n || nc < 0 || nc >= m || map[nr][nc] == 1 || visit[nr][nc]) {
                d = nd;
                continue;
            }
            //왼쪽 방향이 벽이 아니고 청소할 수 있는 곳이면 전진한다.
            if (!visit[nr][nc] && map[nr][nc] != 1) {
                r = nr;
                c = nc;
                d = nd;
                //다시 청소 할 수 있도록 while 밖으로 나간다.
                ok = true;
            }
            
            if (ok)break;
        }
        //4방향이 모두 불가능 하면 한 칸 후진한다.
        if (!ok) {
            //반대 방향으로 가야한다.
            if (d == 0 || d == 1) {
                r = r + dr[d + 2];
                c = c + dc[d + 2];
            }
            else {
                r = r + dr[d - 2];
                c = c + dc[d - 2];
            }
            //후진 하려는 곳이 벽이면 종료
            if (map[r][c] == 1)break;
        }
        /*출력(디버깅)
        printf("\n");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                printf("%d ", visit[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        */
    }
 
    printf("%d\n", ans);
 
    return 0;
}
cs

'sw 역량테스트' 카테고리의 다른 글

백준 3190 뱀  (0) 2019.04.24
백준 14890 경사로  (0) 2019.04.16
백준 14889 스타트와 링크  (0) 2019.04.13
백준 14891 톱니바퀴  (0) 2019.04.12
백준 15683 감시  (0) 2019.04.12
Comments