[백준/BOJ] 백준 2733번 : Brainf*ck

2021. 4. 9. 16:45알고리즘 문제풀이

www.acmicpc.net/problem/2733

 

2733번: Brainf*ck

첫째 줄에 프로그램의 개수 T(1 ≤ T ≤ 100)가 주어진다. 각 프로그램은 한줄 또는 그 이상으로 구성되어 있으며, end만 적혀있는 줄로 끝난다. 프로그램에 올바르지 않은 문자 (<>+-.[])가 있다면, 이

www.acmicpc.net

주어진 문자에 따라 값을 수행한다. 주의해야 될 점은 [ , ]를 만났을 때인데, 이를 위해 미리 서로 짝의 정보를 left_right와 right_left에 저장해 놓아서 문제를 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <string>
#include <map>
#include <stack>
using namespace std;

int t;
string info;
vector<char> word(32768);
int point;
string result;
map<int, int> left_right; //[]의 짝을 저장한다([,])순으로 저장
map<int, int> right_left; //[]의 짝을 저장한다(],[)순으로 저장
stack<int> blank;

void Pre()
{
	info.clear();

	for (int i = 0; i < 32768; i++)
		word[i] = 0;

	point = 0;

	result.clear();

	left_right.clear();
	right_left.clear();

	while (!blank.empty())
		blank.pop();
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> t;
	cin.ignore();

	for (int i = 1; i <= t; i++)
	{
		Pre();
		while (1)
		{
			string input;
			getline(cin, input);

			if (input == "end")
				break;

			//주석 뒤는 무시한다
			if (input.find("%") != string::npos)
			{
				int index = input.find("%");

				input = input.substr(0, index);
			}

			info += input;
		}

		for (int j = 0; j < info.size(); j++)
		{
			if (info[j] == '[')
				blank.push(j);

			else if (info[j] == ']')
			{
				if (blank.size() == 0)
				{
					result = "COMPILE ERROR";
					break;
				}

				else //괄호 짝을 저장한다
				{
					int left_b = blank.top();
					blank.pop();
					int right_b = j;

					left_right.insert(make_pair(left_b, right_b));
					right_left.insert(make_pair(right_b, left_b));
				}
			}
		}

		if (blank.size() != 0)
			result = "COMPILE ERROR";

		if (result == "COMPILE ERROR")
		{
			cout << "PROGRAM #" << i << ":" << "\n";
			cout << result << "\n";
			continue;
		}

		for (int j = 0; j < info.size(); j++)
		{
			if (info[j] == '>')
			{
				if (point == 32767)
					point = 0;

				else
					point++;
			}

			else if (info[j] == '<')
			{
				if (point == 0)
					point = 32767;

				else
					point--;
			}

			else if (info[j] == '+')
			{
				if (word[point] == ((1 << 8) - 1))
					word[point] = 0;

				else
					word[point]++;
			}

			else if (info[j] == '-')
			{
				if (word[point] == 0)
					word[point] = ((1 << 8) - 1);

				else
					word[point]--;
			}

			else if (info[j] == '.')
			{
				result += word[point];
			}

			else if (info[j] == '[')
			{
				if (word[point] == 0)
				{
					int next_index = left_right[j];

					j = next_index;
					j--;
				}
			}

			else if (info[j] == ']')
			{

				if (word[point] != 0)
				{
					int next_index = right_left[j];

					j = next_index;
					j--;
				}
			}
		}

		cout << "PROGRAM #" << i << ":" << "\n";
		cout << result << "\n";
	}


	return 0;
}