[백준/BOJ] 백준 27649번 : 토크나이저

2023. 10. 13. 16:04알고리즘 문제풀이

https://www.acmicpc.net/problem/27649

 

27649번: 토크나이저

첫째 줄에 셸 명령문 $S$가 주어집니다. 명령문은 구분자와 알파벳 대소문자, 숫자 및 $, ?, +, _로 이루어져 있습니다. & 또는 |가 홀수 번 연속으로 주어지지 않습니다. $(|S|\le1\,000\,000)$

www.acmicpc.net

 

토큰을 만들어 나가다가 구분자를 만나면 만들던 토큰을 저장하는 방법으로 문제를 해결했다.

 

코드

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

string input;

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

	getline(cin, input);

	vector<string> result;

	string token = "";

	int index = 0;

	while (index < input.size()) {

		//구분자를 만났을때
		if (input[index] == '<' || input[index] == '>' || input[index] == '(' || input[index] == ')' || input[index] == ' ') {
			if (token.size() > 0) {
				result.push_back(token);
				token = "";
			}
			if (input[index] != ' ') {
				token += input[index];
				result.push_back(token);
				token = "";
			}

			index++;
		}
		else if (input[index] == '&' && (index + 1 < input.size() && input[index + 1] == '&')) {

			if (token.size() > 0) {
				result.push_back(token);
				token = "";
			}
			result.push_back("&&");

			index += 2;
		}
		else if (input[index] == '|' && (index + 1 < input.size() && input[index + 1] == '|')) {

			if (token.size() > 0) {
				result.push_back(token);
				token = "";
			}
			result.push_back("||");

			index += 2;
		}

		else { //구분자가 아닐때
			token += input[index];
			index++;
		}

	}

	//마지막 토큰이 있을때
	if (token.size() > 0) {
		result.push_back(token);
	}

	for (int i = 0; i < result.size(); i++) {
		cout << result[i] << " ";
	}

	return 0;
}