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