CodeWars 예순 여덞 번째 문제

Updated:

Dashatize it

public static String dashatize(int num) {
     	
    String numString = convertNumber(num);

    if(numString.length() == 1) {
        return numString;
    }

    List<String> list = new ArrayList<String>();

    String even = "";

    while(numString.length() > 0) {
        int number = Integer.valueOf(numString.substring(0,1));

        if(number % 2 == 1) {
            if(!"".equals(even)) {
                list.add(even);
                even = "";
            }

            list.add(numString.substring(0,1));

        } else {
            even += numString.substring(0,1);
        }

        numString = numString.substring(1);
    }

    if(!"".equals(even)) {
        list.add(even);
    }

    return String.join("-", list);
}

public static String convertNumber(int num) {
    String numString = String.valueOf(num);

    if(num < 0){
        numString = numString.substring(1);
    }

    return numString;
}
  • 두 가지 문제가 있었다.
  • 하나는 Integer.MIN_VALUE 였고 나머지 하나는 마지막에 짝수가 올 경우였다.
  • 첫 번째 Integer.MIN_VALUE의 경우는 음수이므로 일단 string으로 변환하고 앞에 -를 삭제하는 방식으로 처리 하였다. Math.abs를 Integer.MIN_VALUE를 바꿀 수 없기 때문에 문제가 생겨서 이렇게 처리 하였다.
  • 두 번째 마지막 짝수일 경우이다. 이 경우 때문에 for이 끝나고 짝수가 남아 있다면 list에 추가하여 출력하였다.
  • 그러나 우리의 best 코드는 이러한 헛짓거리(?)를 한방에 없앨 수 있었다.
  • 바로 정규식을 통해서 홀수(1,3,4,7,9)인 문자들 앞 뒤로 -를 붙인뒤 앞뒤에 -를 제거하고 -가 두 개인 경우 -로 제거 하였다.
  • ^-의 뜻은 “단순 문자열의 시작이 -이면”이라는 뜻이다 ^[a]이러면 []는 범위를 나타내므로 문자열들 중에서 모든 a에 대하여라는 뜻이다.
  • $는 패턴의 종료를 말한다. 즉 -$의 경우 문자열 끝에 -를 말한다.
  • 크으… 정규식을 이번에 이렇게 또 배워간다.
public static String dashatize(int num) {
    return Integer.toString(num).replaceAll("([13579])","-$1-")
        .replaceAll("--","-").replaceAll("^-","").replaceAll("-$","");
}

이번 문제로 500점 돌파