반응형
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<int, int> m; memset(arr, 0, sizeof(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 |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 2631번 - 줄세우기 (C++) (0) | 2022.10.19 |
---|---|
[ 백준 ] 2636번 - 치즈 (C++) (0) | 2022.10.16 |
[ 백준 ] 15486번 - 퇴사 2 (C++) (0) | 2022.10.14 |
[ 백준 ] 14442번 - 벽 부수고 이동하기 2 (C++) (0) | 2022.10.13 |
[ 백준 ] 17472번 - 다리 만들기 2 (C++) (0) | 2022.10.12 |