알고리즘 문제풀이/백준

[백준/BOJ] 3568번 iSharp (C++)

노력의천재 2021. 10. 10. 17:20

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

 

3568번: iSharp

입력으로 주어진 변수 선언문을 문제의 조건에 맞게 변형한 뒤, 한 줄에 하나씩 출력한다. 변수형과 변수명 사이에는 공백이 하나 있어야 한다. 출력은 입력으로 주어진 변수 선언문에서 변수가

www.acmicpc.net

구현 자체는 어렵지 않은데 고려해야 할 사항이 많아서 까다롭다. 첫 번째로 변수 오른쪽 옆에 붙은 &, *, []을 왼쪽으로 역순으로 옮길 때, []은 모양이 유지 되어야 한다. 두 번째는 변수명이 두 글자 이상일 수 있다. 예를들어 aa, AbCdE 등이 될 수 있다. 

 

#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;

int main(void) {
//	ios_base::sync_with_stdio(false);
//	cin.tie(0);
	
	string str;
	getline(cin, str);
		
	int pos = 0;
	for(int i = 0; i < str.size(); i++) {
		if(str[i] == ' ') {
			pos = i;
			break;
		}
	}
	
	string sub1, sub2;
	sub1 = str.substr(0, pos);
	sub2 = str.substr(pos + 1, str.size() - pos);

	stringstream ss(sub2);
	string token;
	
	while(getline(ss, token, ',')) {
		if(token.front() == ' ') token.erase(token.begin());
		if(token.back() == ';') token.pop_back();	
	
		int alpha_pos = 0;
		string alpha = "", var = "";
		for(int i = 0; i < token.size(); i++) {
			if(!isalpha(token[i])) {
				alpha_pos = i;
				break;
			}
		} 
		
		alpha = token.substr(0, alpha_pos);
		
		if(alpha != "") {
			for(int i = token.size() - 1; i >= alpha_pos; i--) {
				if(token[i] == '[') var += "]";
				else if(token[i] == ']') var += "[";
				else var += token[i]; 
			}
			cout << sub1 + var << " " << alpha << ";\n";
		} else {
			cout << sub1 << " " << token << ";\n";
		}
		
	}
}