본문 바로가기
[PS] 문제풀이/백준

[ 백준 2733 ] Brain f*ck (C++)

by 안산학생 2019. 12. 3.

[문제보기]

 

[해결과정]

 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<intint> 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] == 0return m.at(idx) + 1;
        else return idx + 1;
 
    case ']':
        if (arr[p] != 0return 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, 0sizeof(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 인터프리터

 



댓글