본문 바로가기
Algorithm/Baekjoon

Baekjoon 3613 Java vs C++ JAVA

by Hunveloper 2022. 6. 9.
728x90

 

3613번: Java vs C++

Java 예찬론자 김동규와 C++ 옹호가 김동혁은 서로 어떤 프로그래밍 언어가 최고인지 몇 시간동안 토론을 하곤 했다. 동규는 Java가 명확하고 에러가 적은 프로그램을 만든다고 주장했고, 동혁이는

www.acmicpc.net

문제

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

풀이

입력받는 변수명을 탐색하면서 대문자가 있다면 Java 형식으로 체크, 언더바가 있다면 C++ 형식으로 체크한다. 입력된 문자가 문자가 아니고 _가 아니면 잘못된 문자이기에 err 체크를 해준다.

if문에서는 JAVA의 변수명도 처음 문자는 대문자가 오지 못하기에 체크해주고, C++의 변수형태와 JAVA의 변수형태는 둘다 True이거나 False일 수 없다. 마지막에도 space가 들어 갈 수 없기에 마지막에 _가 들어가는 것도 오류이다. 또한 __가 처음에도 오지 못하고 __가 두개 들어 갈 수도 없다. 이런 경우에는 Error를 출력하고 종료한다.

Error가 아니라면 각각에 맞게 대문자를 _소문자로 변환하고, _를 대문자로 변환하는 작업을 한다

코드
import java.io.*;

public class Main {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		String s = br.readLine();
		boolean isC=false, isJ=false, err=false;
		for(int i=0;i<s.length();i++) {
			char cur=s.charAt(i);
			if(cur>='A' && cur<='Z')
				isJ=true;
			if(cur=='_')
				isC=true;
			if(!(Character.isLetter(cur) || cur=='_')) {
				err=true;
				break;
			}
		}
		if(Character.isUpperCase(s.charAt(0)) || isJ && isC || s.charAt(s.length()-1)=='_' || s.charAt(0)=='_' || s.contains("__") ||  err)
			sb.append("Error!");
		else if(isC) {
			for(int i=0;i<s.length();i++)
				if(s.charAt(i)=='_')
					sb.append((char)(s.charAt(++i)-'a'+'A'));
				else
					sb.append(s.charAt(i));
		}
		else {
			for(int i=0;i<s.length();i++)
				if(s.charAt(i)>='A' && s.charAt(i)<='Z')
					sb.append("_"+(char)(s.charAt(i)-'A'+'a'));
				else
					sb.append(s.charAt(i));
		}
		System.out.println(sb.toString());
	}
}

 

728x90
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

Baekjoon 9763 마을의 친밀도 JAVA  (0) 2022.06.09
Baekjoon 4101 크냐? JAVA  (0) 2022.06.09
Baekjoon 21966 (중략) JAVA  (0) 2022.06.09
Baekjoon 2506 점수계산 JAVA  (0) 2022.06.09
Baekjoon 24883 자동완성 JAVA  (0) 2022.06.08

댓글