[Programmers]-신규 아이디 추천

문제

문자열을 얼마나 잘 다루는지 알 수 있는 문제이다. 정규표현식이 더중요하다.

코드

import java.util.*;

class Solution {
    public String solution(String new_id) {
        //1단계
        new_id = new_id.toLowerCase();

        //2단계
        new_id = new_id.replaceAll("[^a-z0-9-_.]","");

        StringBuilder sb = new StringBuilder(new_id);
        //3단계
        for(int i=0;i<sb.length()-1;i++){
            if(sb.charAt(i) == '.'){
                for(int j=i+1;j<sb.length();j++){
                    if(sb.charAt(j) != '.') break;
                    sb.deleteCharAt(j--);
                }
            }
        }

        //4단계
        if(sb.length() != 0){
            if(sb.charAt(0)=='.') sb.deleteCharAt(0);
        }
        if(sb.length() != 0){
            if(sb.charAt(sb.length()-1)=='.') sb.deleteCharAt(sb.length()-1);   
        }

        //5단계
        if(sb.length() == 0) sb.append("a");

        //6단계
        if(sb.length() >= 16) sb.delete(15,sb.length());

        //7단계
        if(sb.length() <= 2){
            String s = ""+sb.charAt(sb.length()-1);
            while(sb.length() != 3){
                sb.append(s);
            }
        }
        //4단계
        if(sb.length() != 0){
            if(sb.charAt(0)=='.') sb.deleteCharAt(0);
        }
        if(sb.length() != 0){
            if(sb.charAt(sb.length()-1)=='.') sb.deleteCharAt(sb.length()-1);   
        }
        return sb.toString();
    }
}

코드 설명

각 단계별로 적어 놓았다.

요약

  • 정규식으로 더 쉽게 푸는 방법이 있다.

정규식을 잘 이용한 코드

import java.util.*;

class Solution {
    public String solution(String new_id) {
        //1단계
        new_id = new_id.toLowerCase();

        //2단계
        new_id = new_id.replaceAll("[^a-z0-9-_.]","");
        
        new_id = new_id.replaceAll("[.]{2,}",".");//3단계
        new_id = new_id.replaceAll("^[.]|[.]$","");//4단계
        StringBuilder sb = new StringBuilder(new_id);
        //5단계
        if(sb.length() == 0) sb.append("a");
        
        //6단계
        if(sb.length() >= 16) sb.delete(15,sb.length());
        
        //7단계
        if(sb.length() <= 2){
            String s = ""+sb.charAt(sb.length()-1);
            while(sb.length() != 3){
                sb.append(s);
            }
        }
        
        new_id = sb.toString();
        new_id = new_id.replaceAll("^[.]|[.]$","");//4단계
        return new_id;
    }
}

정규식

  • []괄호 밖의 ^는 시작부분, $는 끝부분
  • []괄호 안의 ^는 이후문자를 제외한다
  • 2단계 a-z,0-9,-,_,. 을 제외한 나머지를 공백으로 바꾼다.
  • {n,}는 앞 표현식이 n번 이상 일치하면이다. {n}은 n번 일치이다.