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");
}