몽셀통통의 블로그

[BaekJoon] 2174 로봇 시뮬레이션 :: monton 본문

프로그래밍/백준 문제 풀기

[BaekJoon] 2174 로봇 시뮬레이션 :: monton

몽통이 2018. 6. 13. 17:15



문제

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



풀이

이 문제는 알고리즘 개념이 필요없는 문제이다.

좌표 입력 값이 특이하므로 간단하게 설정해준다

(주어진 좌표값을 살짝 바꾸어 원래 좌표형식을 바꾸어 주었다)

처음에는 왼쪽으로 주어져있지만 오른쪽으로 바꾸어주었다


그리고 for문을 통해서 명령어를 순서대로 진행하였다

여기서 사용된 알고리즘이나 트릭은 딱히 없었다.


이 문제가 알고리즘을 쓰지 않는거에 비해 생각보다 정답률이 낮았는데

그 이유에는 내생각엔 인덱스 수정이 부분부분 많이 필요해서 그런것 같다


내가 처음에 틀렸던 이유는 나는 좌표의 인덱스를 바꾸어 주어서 방향 수정을 해주지 않아도 되는데

방향 수정을 하는 바람에 많이 틀렸다


두번째로 틀렸던 이유는 명령어가 'F'이고 횟수가 7번일때, 같은 방향으로 7번을 나가야 하는데

새로운 변수 x,y를 두어 현재까지 나아간 방향을 저장하여야 지속적으로 그 방향을 나갈 수 있다

이 부분을 놓쳐서 몇번 더 틀렸다.


다른 테이스 케이스를 몇번 더 돌려보면서 왜 틀렸는지 찾는게 시간을 절약하는 방법이다

2074 로봇 시뮬레이션 테스트 케이스/예제 : https://ncpc.idi.ntnu.no/ncpc2005/#problems 




코드

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
#include <iostream>
using namespace std;
 
int A,B,N,M;
int arr[101][101][2];
int dir[4][2= { {-1,0},{0,1},{1,0},{0,-1} };
 
int chgdir(char c) {
    if (c == 'N'return 0;
    if (c == 'E'return 1;
    if (c == 'S'return 2;
    if (c == 'W'return 3;
}
 
int main() {
    cin >> A >> B;
    cin>>>> M;
 
    for (int i = 1; i <= N; i++) {
        int a, b;
        char c;
        cin >> a >> b >> c;
        arr[B - b][a - 1][0= i;
        int d = chgdir(c);
        arr[B - b][a - 1][1= d;
    }
 
 
    
    for (int n = 0; n < M; n++) {
        int q, w,flag=0;
        char e;
        cin >> q >> e>>w;
 
        for (int i = 0; i < B; i++) {
            for (int j = 0; j < A; j++) {
                if (q == arr[i][j][0]) {
                    int x = i;
                    int y = j;
                    while (w) {
                        if (e == 'R') {
                            arr[x][y][1= arr[x][y][1+ 1 == 4 ? 0 : arr[x][y][1+ 1;
                        }
                        if (e == 'L') {
                            arr[x][y][1= arr[x][y][1- 1 == -1 ? 3 : arr[x][y][1- 1;
                        }
                        if (e == 'F') {
                            int nx = x + dir[arr[x][y][1]][0];
                            int ny = y + dir[arr[x][y][1]][1];
                            
                            if (nx < 0 || nx >= B || ny < 0 || ny >= A) {
                                printf("Robot %d crashes into the wall", q);
                                return 0;
                            }
 
                            if (arr[nx][ny][0]) {
                                printf("Robot %d crashes into robot %d\n",q,arr[nx][ny][0]);
                                return 0;
                            }
 
                            arr[nx][ny][0= arr[x][y][0];
                            arr[nx][ny][1= arr[x][y][1];
                            arr[x][y][0= arr[x][y][1= 0;
                            x = nx, y = ny;
                        }
                        w--;
                    }
                }
            }
        }
    }
    cout << "OK" << endl;
}
cs