본문 바로가기

Algorithm

백준 3613번 Java vs C++

반응형

문제

Java 예찬론자 김동규와 C++ 옹호가 김동혁은 서로 어떤 프로그래밍 언어가 최고인지 몇 시간동안 토론을 하곤 했다. 동규는 Java가 명확하고 에러가 적은 프로그램을 만든다고 주장했고, 동혁이는 Java는 프로그램이 느리고, 긴 소스 코드를 갖는 점과 제네릭 배열의 인스턴스화의 무능력을 비웃었다.

또, 김동규와 김동혁은 변수 이름을 짓는 방식도 서로 달랐다. Java에서는 변수의 이름이 여러 단어로 이루어져있을 때, 다음과 같은 방법으로 변수명을 짓는다. 

첫 단어는 소문자로 쓰고, 다음 단어부터는 첫 문자만 대문자로 쓴다. 또, 모든 단어는 붙여쓴다. 따라서 Java의 변수명은 javaIdentifier, longAndMnemonicIdentifier, name, bAEKJOON과 같은 형태이다.

반면에 C++에서는 변수명에 소문자만 사용한다. 단어와 단어를 구분하기 위해서 밑줄('_')을 이용한다. C++ 변수명은 c_identifier, long_and_mnemonic_identifier, name, b_a_e_k_j_o_o_n과 같은 형태이다.

이 둘의 싸움을 부질없다고 느낀 재원이는 C++형식의 변수명을 Java형식의 변수명으로, 또는 그 반대로 바꿔주는 프로그램을 만들려고 한다. 각 언어의 변수명 형식의 위의 설명을 따라야 한다.

재원이의 프로그램은 가장 먼저 변수명을 입력으로 받은 뒤, 이 변수명이 어떤 언어 형식인지를 알아내야 한다. 그 다음, C++형식이라면 Java형식으로, Java형식이라면 C++형식으로 바꾸면 된다. 만약 C++형식과 Java형식 둘 다 아니라면, 에러를 발생시킨다. 변수명을 변환할 때, 단어의 순서는 유지되어야 한다.

재원이는 프로그램을 만들려고 했으나, 너무 귀찮은 나머지 이를 문제를 읽는 사람의 몫으로 맡겨놨다.

재원이가 만들려고 한 프로그램을 대신 만들어보자.

입력

첫째 줄에 변수명이 주어진다. 영어 알파벳과 밑줄('_')로만 이루어져 있고, 길이는 100을 넘지 않는다.

출력

입력으로 주어진 변수명이 Java형식이면, C++형식으로 출력하고, C++형식이라면 Java형식으로 출력한다. 둘 다 아니라면 "Error!"를 출력한다.

 

 

대문자가 나온 후 '_'가 나온 경우

'_'가 나온 후 대문자가 나온 경우

맨 앞자리가 대문자인 경우

맨 앞자리가 '_'인 경우

맨 뒷자리가 '_'인 경우

'_'가 연속으로 두 번 이상 나온 경우

 

이렇게 예외를 지정해 줬는데 

문제점은 '_'인 순간 '_'을 제외한 다음 문자부터 더 해 주기 위해서 인덱스를 2만큼 증가 시키는데

만약 '_' 바로 뒤에 대문자가 붙어 온다면 이것을 무시하고 가버리기 때문에 해당 상황에 대한 예외 처리 해줬다. 

#include<iostream>
#include<string>

using namespace std;

string str;
string temp;

void transjava(int index)
{
	temp += '_';
	int num = 'a'-'A';
	char c = str[index] + num;
	temp += c;
	
}

void transcpp(int index)
{
	
	int num = 'a'-'A';
	char c = str[index+1]-num;
	temp += c;
	
}




int main(void)
{
	
	
	
	
	bool java = false;
	bool cpp = false;
	
	
	cin >> str;
	
	
	
	int i = 0;
	
	while(i < str.size())
	{
		
			if(str[i] != '_')
			{
				int test = str[i] - 'a';
				if(test < 0)
				{
					
					
					if(i == 0)
					{
						cout << "Error!" <<endl;
						return 0;
					}
					
					
					
			   		java = true;
			   		if(java && cpp)
			   		{
			   			cout << "Error!" <<endl;
						return 0;
				   	}
			   		transjava(i);
			   		i++;
			   	
				}
				else
				{
					temp += str[i];
					i++;
									
				}

				
				
			}
			else if(str[i] == '_')
			{
				int test = str[i+1] - 'a';
				if(str[i+1] == '_')
				{
					cout << "Error!" <<endl;
					return 0;
				}
				else if(test <0)
				{
					cout << "Error!" <<endl;
					return 0;
				}
				
				if( i == str.size()-1 || i == 0)
				{
					cout << "Error!" <<endl;
					return 0;
				}
			
				cpp = true;
				if(java && cpp)
			   	{
				
			   		cout << "Error!" <<endl;
					return 0;
				}
				transcpp(i);
				i += 2;
				
			}
			
			
	
		if(java && cpp)
		{
		
			cout << "Error!" <<endl;
			return 0;
		
		}
		
		
		
	}


		cout<<temp<<endl;
	
}
반응형