[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.