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());
}
}
'알고리즘 > String' 카테고리의 다른 글
[백준] 14713 앵무새 - 큐(Queue) + 문자열(String) JAVA (0) | 2024.10.12 |
---|---|
[백준] 9342 염색체 - 정규표현식(Regular Expression) + 문자열(String) JAVA (0) | 2024.10.10 |
[백준] 2607 비슷한 단어 - 구현(Implementation) + 문자열(String) JAVA (0) | 2023.08.07 |
[백준] 20920 영단어 암기는 괴로워 - 문자열(String) + 정렬(Sort) + 해시맵(HashMap) JAVA (0) | 2023.08.05 |