관리 메뉴

한다 공부

[C++] 백준 알고리즘 3613번 Java vs C++ 본문

Algorithm/문제풀이

[C++] 백준 알고리즘 3613번 Java vs C++

사과당근 2021. 9. 16. 17:14

문제가 많이 긴데

결론은 문자열을 자바스타일에서 c++스타일로,

혹은 그 반대로 변환하면 되는 문제다

 

 

c++ 스타일의 문자열은 소문자와 언더바로 구성되는데

이 언더바가 오류를 많이 발생시킨다.

 

_c도 에러 (시작이 언더바)

c_도 에러 (마지막도 언더바)

c__c도 에러다. (언더바가 두 번 나와도 에러)

#include<iostream>

using namespace std;

string ctoj(string name) {
	string j;
	for (int i = 0; i < name.length(); i++) {
		if (name[i] == '_') {
			j += name[i + 1] - 32;
			i++;
		}
		else
			j += name[i];
	}
	return j;
}

string jtoc(string name) {
	string c;
	for (int i = 0; i < name.length(); i++) {
		if (name[i] >= 'A' && name[i] <= 'Z') {
			c += '_';
			c += name[i] + 32;
		}
		else
			c += name[i];
	}
	return c;
}

int main() {
	string name;
	string type="default";

	cin >> name;
	for (int i = 0; i < name.length(); i++) {
		if (name[i] == '_') {
			// type이 java일 때 '_'가 등장하면 에러 (대문자, 언더바 섞였다는 뜻)
			//맨 처음에 _로 시작하면 에러, 시작은 소문자여야함.
			//맨 마지막에 _로 끝나도 에러, ex. c_는java로 변환불가
			//_가 두 번 연속 나와도 에러, 인덱스가 -1이면 문제가 생기므로 i!=0이라는 조건을 줌
			if (type == "java" || i==0 || i==name.length()-1 || i != 0 && name[i - 1] == '_') {
				type = "error";
				break;
			}
			type = "c++";
		}

		if (name[i] >= 'A' && name[i] <= 'Z') {
			if (type == "c++" || i == 0) {
				type = "error";
				break;
			}
			type = "java";
		}
	}

	if (type == "c++")
		cout << ctoj(name) << '\n';
	else if (type == "java")
		cout << jtoc(name) << '\n';
	else if (type == "default")
		cout << name << '\n';
	else
		cout << "Error!" << '\n';

}