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

코드설명

문자열(String) + 파싱(Parsing) + 정규표현식(RegExp) 를 활용합니다.

 

정규표현식을 활용한다면, 주어진 변수명이 C++인지 JAVA인지 매우 간단하게 패턴을 찾아낼수 있습니다.

만약, 정규표현식을 사용하지 않는다면 조건절이 상당히 많이 들어가게 되고, 코드가 복잡해집니다.

코드

정답코드1입니다. 해당 코드가 JAVA인지 C++인지 판단하기 위해 정규표현식을 통해 Pattern을 구별합니다.

개인적으로 가장 마음에 드는 코드입니다. 물론 정답코드2와 같이 Matcher를 활용하여서 변경할 변수명을 손쉽게 변경하는 방식도 있지만, 현재로써는 Matcher 대신에 반복문을 통해 구현하는 것이 더 간단하다고 느껴집니다.

package Main;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Main {
	static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T;
	static int answer = 0;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//		StringTokenizer st = new StringTokenizer(br.readLine());
		
		String str = br.readLine();
		
		System.out.println(convert(str));
	}
	
	public static String convert(String str) {
		//C++을 JAVA로 변환
		StringBuilder sb = new StringBuilder();
        if (Pattern.matches("^[a-z]+(_[a-z]+)*$", str)) {
			String[] split = str.split("[_]");
			sb.append(split[0]);
			for(int i=1; i<split.length; i++) {
				Character firstWord = split[i].charAt(0);
				sb.append( Character.toUpperCase(firstWord) );
				sb.append(split[i].substring(1));
			}
			return sb.toString();
        }
        //JAVA를 C++로 변환
        else if (Pattern.matches("^[a-z]+([A-Z][a-z0-9]*)*$", str)) {
			sb.append(str.charAt(0));
			for(int i=1; i<str.length(); i++) {
				if(Character.isUpperCase(str.charAt(i)) == true) {
					sb.append("_");
				}
				sb.append(Character.toLowerCase(str.charAt(i)));
			}
			return sb.toString();
        }
        //예외처리
        else {
            return "Error!";
        }
		
	}
		
	
}

 

정답코드2입니다. 정규표현식을 사용할경우입니다. 정답코드 1과는 다른점은, Matcher와 같은 라이브러리를 통해 특정 단어를 찾는데도 정규표현식을 활용합니다. 

package Main;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Main {
	static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T;
	static int answer = 0;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//		StringTokenizer st = new StringTokenizer(br.readLine());
		
		String str = br.readLine();
		
		System.out.println(convert(str));
	}
	
	public static String convert(String name) {
		//C++을 JAVA로 변환
        if (Pattern.matches("^[a-z]+(_[a-z]+)*$", name)) {
            StringBuilder sb = new StringBuilder();
            Matcher m = Pattern.compile("_([a-z])").matcher(name);
            int lastIndex = 0;
            while (m.find()) {
                sb.append(name.substring(lastIndex, m.start()));
                sb.append(m.group(1).toUpperCase());
                lastIndex = m.end();
            }
            sb.append(name.substring(lastIndex));
            return sb.toString();
        }
        //JAVA를 C++로 변환
        else if (Pattern.matches("^[a-z]+([A-Z][a-z0-9]*)*$", str)) {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < name.length(); i++) {
                char c = name.charAt(i);
                if (Character.isUpperCase(c)) {
                    sb.append('_');
                    sb.append(Character.toLowerCase(c));
                } else {
                    sb.append(c);
                }
            }
            return sb.toString();
        }
        //예외처리
        else {
            return "Error!";
        }
		
	}
		
	
}

처음에 작성한 오답코드입니다.

변환 방법은 맞으나, java 변수명도 아니고, C++ 변수명도 아닐경우에 오류가 발생합니다.

package Main;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;
 
public class Main {
	static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T;
	static int answer = 0;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//		StringTokenizer st = new StringTokenizer(br.readLine());
		
		String str = br.readLine();
		
		StringBuilder sb = new StringBuilder();
		if(str.contains("_") && Character.isLowerCase(str.charAt(0)) && str.charAt(str.length() - 1) != '_') {
			String[] split = str.split("[_]");
			sb.append(split[0]);
			for(int i=1; i<split.length; i++) {
				Character firstWord = split[i].charAt(0);
				sb.append( Character.toUpperCase(firstWord) );
				sb.append(split[i].substring(1));
			}
		}else if(!str.contains("_") && Character.isLowerCase(str.charAt(0))) {
			sb.append(str.charAt(0));
			for(int i=1; i<str.length(); i++) {
				if(Character.isUpperCase(str.charAt(i)) == true) {
					sb.append("_");
				}
				sb.append(Character.toLowerCase(str.charAt(i)));
			}
		}else {
			System.out.println("Error!");
			return ;
		}
		
		System.out.println(sb.toString());
	}
		
	
}

+ Recent posts