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 |