백준 2174 로봇 시뮬레이션
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 2174 로봇 시뮬레이션

by KyeongMin 2019. 9. 9.
728x90
반응형

https://www.acmicpc.net/problem/2174

 

2174번: 로봇 시뮬레이션

문제 가로 A(1≤A≤100), 세로 B(1≤B≤100) 크기의 땅이 있다. 이 땅 위에 로봇들이 N(1≤N≤100)개 있다. 로봇들의 초기 위치는 x좌표와 y좌표로 나타난다. 위의 그림에서 보듯 x좌표는 왼쪽부터, y좌표는 아래쪽부터 순서가 매겨진다. 또한 각 로봇은 맨 처음에 NWES 중 하나의 방향을 향해 서 있다. 초기에 서 있는 로봇들의 위치는 서로 다르다. 이러한 로봇들에 M(1≤M≤100)개의 명령을 내리려고 한다. 각각의 명령은 순차적으로

www.acmicpc.net

 

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
#include<stdio.h>
#define NSIZE 50
#define MSIZE 50
using namespace std;
int input[NSIZE][MSIZE];
int dy[] = { 0,-1,0,1 };
int dx[] = { 1,0,-1,0 };
int N, M, A, B;
struct Data {
    int y, x; char dir;
};
Data robot[101];
void init() {
    scanf("%d %d"&M, &N);
    scanf("%d %d"&A, &B);
    for (int i = 0; i < A; i++) {
        scanf("%d %d %c"&robot[i + 1].x, &robot[i + 1].y, &robot[i + 1].dir);
        robot[i + 1].x -= 1;
        robot[i + 1].y -= 1;
        input[robot[i + 1].y][robot[i + 1].x] = i + 1;
    }
    for (int i = 0; i < B; i++) {
        int RN; char order; int cnt;
        scanf("%d %c %d"&RN, &order, &cnt);
 
        int dir;
        if (robot[RN].dir == 'E') dir = 0;
        else if (robot[RN].dir == 'S') dir = 1;
        else if (robot[RN].dir == 'W') dir = 2;
        else if (robot[RN].dir == 'N') dir = 3;
 
        for (int j = 0; j < cnt; j++) {
            if (order == 'L') {
                dir--;
                dir = (dir + 4) % 4;
                if (dir == 0) robot[RN].dir = 'E';
                else if (dir == 1)robot[RN].dir = 'S';
                else if (dir == 2)robot[RN].dir = 'W';
                else if (dir == 3)robot[RN].dir = 'N';
            }
            if (order == 'R') {
                dir++;
                dir = (dir) % 4;
 
                if (dir == 0) robot[RN].dir = 'E';
                else if (dir == 1)robot[RN].dir = 'S';
                else if (dir == 2)robot[RN].dir = 'W';
                else if (dir == 3)robot[RN].dir = 'N';
            }
            if (order == 'F') {
                robot[RN].y += dy[dir];
                robot[RN].x += dx[dir];
                if (0 <= robot[RN].y && robot[RN].y < N && 0 <= robot[RN].x&& robot[RN].x < M) {// 범위 안 일때
                    if (input[robot[RN].y][robot[RN].x] == 0) {
                        input[robot[RN].y][robot[RN].x] = input[robot[RN].y - dy[dir]][robot[RN].x - dx[dir]];
 
                        input[robot[RN].y - dy[dir]][robot[RN].x - dx[dir]] = 0;
                    }
                    else {
                        if (i < B) {
                            int R = RN;
                            while (i < B - 1) {
                                scanf("%d %c %d"&RN, &order, &cnt);
                                i++;
                            }
                            printf("Robot %d crashes into robot %d", R, input[robot[R].y][robot[R].x]);
                            return;
                        }
                    }
                }
                else {// 범위 넘어서는 경우
                    if (i < B) {
                        int R = RN;
                        while (i < B - 1) {
                            scanf("%d %c %d"&RN, &order, &cnt);
                            i++;
                        }
                        printf("Robot %d crashes into the wall\n", R);
                        return;
                    }
 
 
                }
 
            }
        }
    }
    printf("OK\n");// 제대로 수행이된경우
}
int main(void) {
    init();
 
    return 0;
}
 
 

이전에 풀어보긴 했지만 그때는 뭔가 너무 바보 같이 짰던것같습니다. 코드길이가 바이트로 두배정도의 소스 였다.

이문제가 어렵지는 않은데 까다롭다고 느껴지는것이 방향 설정 인것같습니다.

 

문제를 잘보시면

출처 : 백준 온라인 사이트

인데 우리가 사용할 배열은 

0,0 부터 소스를 구현했지만, 우선 1,1 이라고 했을경우 배열의 상태는 저러합니다.

그렇게 되면 저 방향도 바뀌어야한다 생각을 했고 

방향역시 이렇게 설정을 해야한다.

여기서 함정이 있었다. 여기까지만 해도 되겠지 했는데 그게 아니여서 좀 삽질을 했습니다.

여기서  L 과 R ,F 명령어가 있습니다.

이때 L 이 R이 되야하고 R 이 L 이 되야하는점 이였습니다.

이게 무슨 말이지 하는 분들을위해 설명해드리자면 이렇습니다.

뒤집었기떄문에 제대로 동작하게 하려면 L의 동작을 주면 R로 움직이게 

R의 동작을 주면 L로 동작을 주도록해야 풀이가 가능합니다. 무튼 이것만 해결하시면 정말 쉬운 문제입니다.

오늘은 여기까지이고 이런 포인트 하나하나 기억해서 알고 마스터합시다. 파이팅!!!

 

 

728x90
반응형

'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글

백준 1938 통나무 옮기기  (0) 2019.09.11
백준 3987 보이저 1호  (0) 2019.09.09
백준 2529 부등호  (0) 2019.09.09
백준 3055 탈출  (0) 2019.09.09
백준 16985 Maaaaaaaaaze  (0) 2019.09.09

댓글