반응형

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

 

3954번: Brainf**k 인터프리터

각 테스트 케이스에 대해서, 프로그램이 종료된다면 "Terminates"를, 무한 루프에 빠지게 된다면 "Loops"를 출력한다. 무한 루프에 빠졌을 때는, 프로그램의 어느 부분이 무한 루프인지를 출력한다. ([

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. 각각의 브라켓의 쌍을 저장할 수 있도록 map을 선언합니다.

 

2. stack을 사용하여 ' [ '를 만나면 stack에 현재 idx를 push 하고, ' ] '를 만나면 stack의 top과 쌍이므로 map [ i ] = stack.top(), map [ stack.top() ] = i를 저장해줍니다.

 

3. 5천만번 반복했을 때 무한 루프 안이거나 프로그램은 항장 종료되어 있기 때문에 5천만 번 반복 후에도 끝나지 않으면 무조건 무한 루프 안입니다.

 

4. 5천 만번 실행 후 한번 더 5천만 번 실행하면서 무한 루프 안이므로 도달한 최대 idx를 max에 저장하고 그에 맞는 쌍을 출력해주면 됩니다.

 

[ 소스코드 ]

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
#include<iostream>
#include<stack>
#include<map>
#include<cstring>
 
#define M 256
 
using namespace std;
 
unsigned char arr[100000];
char cal[4097];
char input[4097];
 
int main()
{
    int T;
    scanf("%d"&T);
 
    for (int t = 0; t < T; t++) {
        int sm, sc, si;
        scanf("%d %d %d"&sm, &sc, &si);
        
        stack<int> s;
        map<intint> m;
        memset(arr, 0sizeof(arr));
        scanf("%s", cal);
        scanf("%s", input);
 
        for (int i = 0; i < sc; i++) {
            if (cal[i] == '[') {
                s.push(i);
            }
            if (cal[i] == ']') {
                int temp = s.top();
                s.pop();
                m[temp] = i;
                m[i] = temp;
            }
        }
 
        int cnt = 0;    //연산 횟수
        int cur = 0;    //현재 포이터 위치
        int c = 0;        //현재 연산의 위치
        int in = 0;        //현재 문자열의 위치
        int Max = 0;
 
        while (1) {
            if (cnt > 50000000) {
                Max = max(Max, c);
            }
            if (cal[c] == '+') {
                arr[cur]++;
            }
            else if (cal[c] == '-') {
                arr[cur]--;
            }
            else if (cal[c] == '<') {
                cur--;
                if (cur < 0) {
                    cur = sm - 1;
                }
            }
            else if (cal[c] == '>') {
                cur++;
                if (cur >= sm) {
                    cur = 0;
                }
            }
            else if (cal[c] == '[') {
                if (arr[cur] == 0) {
                    c = m[c];
                }
            }
            else if (cal[c] == ']') {
                if (arr[cur] != 0) {
                    c = m[c];
                }
            }
            else if (cal[c] == ',') {
                if (in < si) {
                    arr[cur] = input[in++];
                }
                else {
                    arr[cur] = 255;
                }
            }
            c++;
            cnt++;
            if (c >= sc) {
                printf("Terminates\n");
                break;
            }
            if (cnt >= 100000000) {
                printf("Loops %d %d\n", m[Max], Max);
                break;
            }
        }
    }
}
cs
반응형

+ Recent posts