Post

[BOJ] 3954 - Brainf**k 인터프리터(210310 업데이트)

문제 링크

자꾸 런타임에러가 나서 엄청난 고통을 받다가 해결했는데, 인덱스를 벗어나게 하지 않기 위해 (now-1)%m 이런식으로 모듈로연산한 값을 대입해준 것이 패인이었다. 아마 C에서 모듈로 연산의 결과값으로 음수를 반환하는 경우가 있는 것 같다는 추측이다.(정확하게 테스트해본 것은 아니다.)

  • 재채점으로 인해 코드를 수정하였다.
소스코드
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
#include <iostream>
#include <queue>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#define MAX 50000001
using namespace std;

int t, m, c, s, cnt, now, buf, mx;
char inst[5000], inp[5000];
unsigned char mem[100005];
map<int, int> bracket;
stack<int> st;

void run(int i, bool mod) {
    for (; i < c && cnt < MAX; i++, cnt++) {
        switch (inst[i])
        {
        case '-':
            mem[now]--;
            break;
        case '+':
            mem[now]++;
            break;
        case '<':
            now--;
            if (now < 0) now += m;
            break;
        case '>':
            now++;
            if (now >= m) now -= m;
            break;
        case '[':
            if (mem[now] == 0) i = bracket[i];
            break;
        case ']':
            if (mem[now] != 0) i = bracket[i];
            break;
        case ',':
            if (buf < s)
                mem[now] = inp[buf++];
            else mem[now] = 255;
            break;
        }
        if (mod) mx = min(i, mx);
    }
    if (!mod) mx = i;
}

int main(void) {
    scanf("%d", &t);
    getchar();
    for (int T = 0; T < t; T++) {
        memset(mem, 0, sizeof(mem));
        bracket.clear();
        now = cnt = buf = 0;
        scanf("%d %d %d", &m, &c, &s);
        scanf("%s %s", inst, inp);
        for (int i = 0; i < c; i++) {
            if (inst[i] == '[')
                st.push(i);
            if (inst[i] == ']') {
                bracket[st.top()] = i;
                bracket[i] = st.top();
                st.pop();
            }
        }
        run(0, false);
        if (cnt == MAX) {
            cnt = 0;
            run(mx, true);
            printf("Loops %d %d\n", mx, bracket[mx]);
        }
        else printf("Terminates\n");
    }
    return 0;
}
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.