[C언어]14503. 로봇 청소기

SW 업무 관련/백준

[C언어]14503. 로봇 청소기

WillBe_ 2018. 9. 16. 17:50

2017년도 상반기 석사 3학기 때 연습 삼아 DS SW직군에 지원했을 때, 풀었던 문제이다.


당시 C만 알던 시기였던 당시 if else 로만 주구장창 코딩했던 기억이 있다. 그때랑 문제가 좀 다른 것 같긴한데...단순 시뮬레이션이다.


우선 해당 자리를 청소해주고, 왼쪽을 살핀다. 왼쪽이 청소 가능하면 이동하고, 청소가 불가능하면 방향만 왼쪽으로 틀어준다.


그리고!!상하좌우 청소가 불가능하면 지금 방향에서 뒤로 한 칸 물러나면 끝~ 



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
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <stdio.h>
#include <string.h>
 
int map[50][50];
int N, M, R, C, D, Count;//D : 0 북, 1 동, 2 남, 3 서
 
int Back()
{
    int r = R, c = C;
    switch (D)
    {
    case 0:
        r++break;
    case 1:
        c--break;
    case 2:
        r--break;
    case 3:
        c++break;
    }
 
    if (map[r][c] != 1)
    {
        R = r;
        C = c;
        return 1;
    }
    return 0;
}
 
int Check()
{
    int r = R, c = C;
 
    switch (D)
    {
    case 0:
        c--break;
    case 1:
        r--break;
    case 2:
        c++break;
    case 3:
        r++break;
    }
    if (D == 0)
        D = 3;
    else
        D--;
    if (map[r][c] == 0)
    {
        R = r; C = c;
        return 1;
    }
    return 0;
}
 
int main()
{
    scanf("%d %d"&N, &M);
    scanf("%d %d %d"&R, &C, &D);
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            scanf("%d",&map[i][j]);
        }
    }
    int Command = 1;
    while (1)
    {
        switch (Command)
        {
        case 1://현재 위치를 청소한다.
            Count++;
            map[R][C] = 2;
            Command = 2;
            break;
        case 2://왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 해당 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행.
            
            for (int i = 0; i < 4; i++)
            {
                if (Check())
                {
                    Command = 1;
                    break;
                }
 
                if (i == 3)//네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진 후 왼 쪽부터 다시 탐색 진행
                {
                    if (Back())
                    {
                        Command = 2;
                        break;
                    }
                    else
                    {
                        printf("%d\n",Count);
                        return 0;
                    }
                }
            }
            break;
        }
    }
    return 0;
}
cs


'SW 업무 관련 > 백준' 카테고리의 다른 글

[C언어] 14502. 연구소(DFS)  (0) 2018.09.23
[C언어]14502. 연구소  (0) 2018.09.17
[C언어]2573. 빙산  (0) 2018.09.16
[C언어] 2015 오목.  (0) 2018.08.21
[C언어] 7562. 나이트의 이동  (0) 2018.08.14