CodeWars 일백 스물 한 번째 문제

Updated:

Salesman’s Travel

public static String travel(String travel, String zipcode) {
    	
    if(zipcode.isEmpty()) {
        return ":/";
    }

    Pattern findPattern = Pattern.compile("^\\d+\\D*"+ zipcode + "," + "|\\d+\\D*"+ zipcode + "," + "|\\d+\\D*"+ zipcode + "$");
    Matcher findMatcher = findPattern.matcher(travel);

    List<String> houseArray = new ArrayList<String>();
    List<String> streetArray = new ArrayList<String>();

    while(findMatcher.find()) {
        String address = findMatcher.group().replaceAll(" " + zipcode + ",?", "");

        houseArray.add(address.split(" ")[0]);
        streetArray.add(address.replaceAll("\\d+ ", ""));
    }

    return zipcode + ":" + String.join(",", streetArray) + "/" + String.join(",", houseArray);
}
  • 나름 괜찮게 풀었다고 생각했다. Best 코드 대부분 쉼표로 나누어서 모두 하나씩 비교했기 때문이다.
  • 그러나 나처럼 필요한 부분만 정규식으로 뽑아서 findPattern을 쉽게 할 수 있는게 없나 Best 코드를 찾아봤는데 딱 하나 있었다.
  • ()안에 ?<>을 하면 <> 뒤에 나온 정규식 표현을 <변수명>을 통해서 제어할 수 있나보다.
  • 블로그 찾아봤는데 이거에 대해서는 자세히 나온게 없어서 일단 이렇게 이해를 했다.
  • 괜찮게 깔끔한 코딩이라 본다.
private final static Pattern pattern = Pattern.compile("(?<nb>\\d{1,5}) (?<str>.+?) (?<zipcode>[A-Z]{2} \\d{5}),?");

public static String travel(String r, String zipcode) {
    final Matcher matcher = pattern.matcher(r);
    final StringBuilder result = new StringBuilder();
    final StringBuilder nb = new StringBuilder();

    result.append(zipcode).append(":");
    
    String delimiter = "";
    
    while (matcher.find()) {
        if (zipcode.equals(matcher.group("zipcode"))) {
            result.append(delimiter).append(matcher.group("str"));
            nb.append(delimiter).append(matcher.group("nb"));
            
            if (delimiter.isEmpty()) {
                delimiter = ",";
            }
        }
    }
    
    result.append("/").append(nb);
    return result.toString();
}