문제
나의 풀이
- 내가 조금 헤맸던 부분은 3단계였다. 처음에 replace를 한 번만 실행해서 "..."와 같은 부분은 처음 ".."가 "."로 바뀐다 하더라도 ".."로 바뀌는 문제가 있었었다. 테스트 코드를 디버깅 하는 과정에서 다행히 이 문제를 인지해서 while문 안에 넣어 주는 것으로 해결했다.
- 그리고 괜히 StringBuffer를 사용해서 성능을 높여보겠다고 고군분투 했으나 계속 에러가 떠서 .. 2단계를 제외하고 전부 String을 이용하는 것으로 바꿨더니 오류가 말끔하게 해결되어 허무한 감정을 느끼기도 했다 .. StringBuffer와 String간의 관계에 대해서 완벽히 이해하고 있지 못한 탓인 것 같다.
class Solution {
public String solution(String new_id) {
String str_id = new_id.toLowerCase();
StringBuffer sb_id = new StringBuffer("");
for(char c: str_id.toCharArray()) {
if(((c>='a' && c<='z') || (c>='0' && c<='9') || c=='-' || c=='_' || c=='.')) {
sb_id.append(c);
}
}
str_id = sb_id.toString();
while(true) {
if(!str_id.contains("..")){
break;
}
str_id = str_id.replace("..", ".");
}
if(str_id.length()>0) {
if(str_id.charAt(0)=='.') str_id = str_id.substring(1);
if(str_id.length()>0 && str_id.charAt(str_id.length()-1)=='.') str_id = str_id.substring(0, str_id.length()-1);
}
int length = str_id.length();
if(length==0) {
str_id = "aaa";
}else if(length>=16) {
if(str_id.charAt(14)=='.') {
str_id = str_id.substring(0,14);
} else {
str_id = str_id.substring(0,15);
}
}else if(length<3) {
while(str_id.length()<3) {
str_id += str_id.charAt(str_id.length()-1);
}
}
return str_id;
}
}
후기
- String의 기본 중의 기본인
substring()
메서드의 end index에 대한 이해가 부족했음을 이 문제를 통해 알 수 있었다.
substring(start,end)에서 end가 exclusive하다는 것은 알고 있었지만, end에 해당 문자열의 길이를 넣으면 맨 마지막 문자까지 포함하여 얻을 수 있다는 것을 다시금 확인하게 되었다.