[해결과정]
1. 문자열 입력 받기
1-1. 공백 포함 : getline(cin, string변수명) 사용
1-2. 만약 입력 받은 문자열이 "end"면 종료
2. 문자열 공백 제거
2-1. 변수.erase(remove(변수.begin(), 변수.end(), ' '), 변수.end());
3. 문자열에 %문자 뒷 부분 제거
3-1. 다른 string변수를 만들어 %문자 이전까지 문자들을 복사했음.
4. 스택 생성
4-1. 만약 '[' 문자가 있다면 스택에 해당 위치(idx)를 push
4-2. 만약 ']' 문자가 있다면 스택에서 top에 있는 idx위치를 받아 '[' 위치 즉 스택에 있던 idx와 ']' 위치 즉 현재 idx 값을 맵에 저장.
5. 스택이 비워있다면 정상적인 과정을 거쳐온 것이므로, 다음과 같이 실행
5-1. 스택이 비워져있지 않다면 '컴파일 오류' 출력 후 다음 테스트 실행
6. 최종적으로 쌓은 문자열 처음부터 끝까지 한글자, 한글자 보며 brain f*ck 기능 실행
6-1. 반복문으로 한글자 한글자 parse 함수 실행
6-2. 최종 문자열 출력
[소스코드]
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
#include<map>
#include<memory.h>
using namespace std;
char arr[32768] = { 0, };
int p = 0;
map<int, int> m;
string str;
string ans;
int parse(int idx) {
switch (str[idx]) {
case '>':
if (p == 32767) p = 0;
else p = p + 1;
break;
case '<':
if (p == 0) p = 32767;
else p = p - 1;
break;
case '+':
if (arr[p] == 255) arr[p] = 0;
else arr[p] = (char)(arr[p] + 1);
break;
case '-':
if (arr[p] == 0) arr[p] = 255;
else arr[p] = (char)(arr[p] - 1);
break;
case '.':
ans += arr[p];
break;
case '[':
if (arr[p] == 0) return m.at(idx) + 1;
else return idx + 1;
case ']':
if (arr[p] != 0) return m.at(idx);
else return idx + 1;
}
return idx + 1;
}
int main() {
int t;
cin >> t;
//숫자 입력 받은 뒤 버퍼 제거
cin.ignore();
for (int o = 0; o < t; o++) {
//초기화
m.clear();
p = 0;
memset(arr, 0, sizeof(arr));
str = "";
cout << "PROGRAM #" << o + 1 << ":\n";
ans = "";
while (true) {
string temp;
// 문자열 입력 받기
getline(cin, temp);
// end 입력 시 반복문 종료
if (temp == "end") break;
// 1. 문자열 공백 제거
temp.erase(remove(temp.begin(), temp.end(), ' '), temp.end());
// 2. % 뒤 문자 제거
string temp2;
for (int i = 0; i < temp.size(); i++) {
if (temp[i] == '%') break;
temp2 += temp[i];
}
str += temp2;
}
stack <int> s;
for (int i = 0; i < str.size(); i++) {
if (str[i] == '[') {
s.push(i);
}
else if (str[i] == ']') {
int idx = s.top();
s.pop();
m.insert(make_pair(i, idx));
m.insert(make_pair(idx, i));
}
}
if (s.empty()) {
for (int i = 0; i < str.length(); i = parse(i)) {
//i = parse(i);
//cout << i << " ";
}
//cout << endl;
}
else {
ans += "COMPILE ERROR";
}
cout << ans << endl;
}
return 0;
}
|
[해결 과정 중 실수한 부분]
문제 풀면서 정말 욕.....
1. 문자열에 대한 지식이 없어, 문자열 공백 제거 && 문자열 공백 포함 입력 && 숫자 입력 후 버퍼 cin.ignore().. 에 대한 내용을 배웠다.
2. 실수를 많이 한 부분은 파싱 함수 부분이다. p+1 증가 시켜야 하는데, p= p+1을 적어야하는데 p+1만 적는 실수를 했다... 찾느라 고생했다................................
3. 다른 실수로 문자 함수를 만들어야하는데, char arr[32768]을 만들어야 하는데 int arr[32768]을 만들었다............. 에휴..
실수를 줄여야겠다는 다짐을 다시 한 번 하게되는 계기가 되었다.. 실수만 줄여도 역테쯤이야......읍읍..; 여기까지.
[관련 문제 혹은 비슷한 문제]
비슷한 문제 : 백준 3954 - Brain f**k 인터프리터
'[PS] 문제풀이 > 백준' 카테고리의 다른 글
[ 백준 1113 ] 수영장 만들기 (C++) (1) | 2019.12.08 |
---|---|
[ 백준 1614 ] 영식이의 손가락 (C++) (0) | 2019.12.04 |
[ 백준 16496 ] 큰 수 만들기 (C++) (0) | 2019.12.03 |
[ 백준 17822 ] 원판 돌리기 (C++) (0) | 2019.12.02 |
[ 백준 17836 ] 공주님을 구해라! (C++) (4) | 2019.11.29 |
댓글