728x90

문제

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!"를 출력한다.

예제 입력 1 복사

long_and_mnemonic_identifier

예제 출력 1 복사

longAndMnemonicIdentifier


문자열 문제이다.

변환 자체는 어렵지 않으나, 예외 처리가 까다로운 문제이다.

예외로는 첫 문자가 대문자거나, _ 문자인 경우, 마지막 문자가 _ 인 경우 그리고 _가 연속으로 나온 경우가 있다.

거기에 추가로 Java 문자열인데 대문자가 나오거나, C++ 문자인데 _가 나오는 경우까지 생각해주면 된다.

 

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/Java%20vs%20C%2B%2B%20(3613%EB%B2%88).cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

 

C++ 코드

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
string str;
bool flag = false;

void JavaToC() {
	while (str.find('_') != string::npos) {
		int pos = str.find('_');
		str.erase(pos,1);
		str[pos] -= ('a' - 'A');
	}
}

void CToJava() {
	for (int i = 0; i < str.size(); i++) {
		if (str[i] < 'a') {
			str.insert(i, "_");
			str[i+1] += ('a' - 'A');
			i++;
		}
	}	
}

int main()
{
	cin >> str;
	//첫 문자가 대문자 또는 _ 또는 마지막 문자가 _면 오류
	if (str[0] < 'a' || str[0]=='_' || str[str.size()-1]=='_') flag = true;
	//연속으로 _가 나오면 오류
	if (flag == false) {
		for (int i = 0; i < str.size()-1; i++) {
			if (str[i] == '_' && str[i + 1] == '_') {
				flag = true;
				break;
			}
		}
	}

	if (str.find('_') != string::npos) {
		//자바 문자에서 대문자가 나오면 오류
		for (int i = 0; i < str.size(); i++) {
			if ('A' <= str[i] && str[i] <= 'Z') {
				flag = true;
				break;
			}
		}
		JavaToC();
	}
	else {
		CToJava();
	}

	if (flag) cout << "Error!";
	else cout << str;
}

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 대충 더해 (8949번)  (0) 2020.08.12
[백준] 구간 곱 구하기 (11505번)  (0) 2020.08.12
[백준] 로봇 조종하기 (2169번)  (0) 2020.07.27
[백준] 게임 (1072번)  (0) 2020.07.23
[백준] 용액 (2467번)  (0) 2020.07.23

+ Recent posts