CodeWars 여든 다섯 번째 문제
Updated:
Simple Pig Latin
public static String pigIt(String str) {
String[] split = str.split(" ");
for(int i = 0; i < split.length; i++) {
split[i] = convertWord(split[i]);
}
return String.join(" " , split);
}
private static String convertWord(String string) {
if(!Pattern.matches("^[a-zA-Z]*$", string)) {
return string;
}
if(string.length() == 1) {
return string + "ay";
}
return string.substring(1) + string.substring(0,1) + "ay";
}
- 문제가 어려운 것은 아니었다.
- 그러나 Best 코드는 정규식을 100프로 활용했다.
- 정규식은 어렵다. 한 번 정리해야하는데 정리한다고 외울 수 있는게 아니라서 이럴때마다 익혀놔야겠다.
- \w의 의미는 알파벳이나 숫자를 의미한다.
- ()의 의미는 문자를 하나의 문자로 인식
- 그래서 (\w)의 의미는 알파벳이나 숫자 하나로만 이루어진 문자열을 의미한다.
- *은 앞 문자가 없을수도 무한정 많을 수도 있다는 뜻이다.
- 그래서 (\w*)의 의미는 앞에 알바벳이나 숫자로만 2개 이상 이루어진 문자열을 의미한다.
- $의 의미는 문자열의 종료를 의미한다.
- 근데 $2$1가 왜 첫번째 문자열이 끝으로 가는거지?
- $가 substring 느낌인듯 한데.. 일단 넘어가자
public static String pigIt(String str) {
return str.replaceAll("(\\w)(\\w*)", "$2$1ay");
}