문제 링크 : 신규 아이디 추천
public String solution(String new_id) {
String answer = "";
int index = 0;
//1단계
new_id = new_id.toLowerCase(Locale.ROOT);
//2단계
while(index < new_id.length()){
if(!((new_id.charAt(index) >= '0' && new_id.charAt(index) <= '9') ||
(new_id.charAt(index) >= 'a' && new_id.charAt(index) <= 'z') || new_id.charAt(index) == '-' ||
new_id.charAt(index) == '_' || new_id.charAt(index) == '.')){
new_id = new_id.substring(0,index) + new_id.substring(index+1);
}else {
index++;
}
}
//3단계
while(new_id.contains("..")){
new_id = new_id.replaceAll("\\.\\.", "\\.");
}
//4단계
if(new_id.charAt(0) == '.'){
new_id = new_id.substring(1);
}
if(new_id.length() > 0 && new_id.charAt(new_id.length()-1) == '.'){
new_id = new_id.substring(0, new_id.length()-1);
}
//5단계
if(new_id.equals("")){
new_id = "a";
}
//6단계
if(new_id.length() > 15){
new_id = new_id.substring(0,15);
if(new_id.charAt(new_id.length()-1) == '.'){
new_id = new_id.substring(0, new_id.length()-1);
}
}
//7단계
if(new_id.length() <= 2){
int length = new_id.length();
do{
new_id += new_id.charAt(length-1);
}while(new_id.length() < 3);
}
return new_id;
}
코드를 보면 알겠지만, 내 풀이는 문제에서 제시한 조건들을 Java 코드들로 구현한 것이다.
이것이 출제자가 의도한 풀이가 맞는지 문제를 풀면서 계속 의심했지만, 다른 방법이 도저히 생각나지 않아서 일단은 풀고, 다른 사람들의 풀이를 참고하려고 했다.
문제를 푼 이후에 다른 사람들의 풀이를 보니, 학부에서 처음 배웠을 때는 별다른 쓰임새를 잘 모르겠던 정규 표현식을 사용해서 문제를 간단하게 푼 것을 확인할 수 있었다.
public String solution(String new_id) {
String answer = "";
String temp = new_id.toLowerCase();
temp = temp.replaceAll("[^-_.a-z0-9]","");
System.out.println(temp);
temp = temp.replaceAll("[.]{2,}",".");
temp = temp.replaceAll("^[.]|[.]$","");
System.out.println(temp.length());
if(temp.equals(""))
temp+="a";
if(temp.length() >=16){
temp = temp.substring(0,15);
temp=temp.replaceAll("^[.]|[.]$","");
}
if(temp.length()<=2)
while(temp.length()<3)
temp+=temp.charAt(temp.length()-1);
answer=temp;
return answer;
}
내가 푼 풀이에 비하면 코드가 훨씬 간결해졌다. 풀이할 때 알고리즘적인 생각에만 몰두했었는데, 문자열을 다루는 문제가 나오면 정규 표현식도 조금 더 공부해서 사용해봐야겠다는 생각이 들었다.