본문 바로가기
개발/알고리즘

[프로그래머스/JAVA] 신규 아이디 추천

by zuzuu 2022. 7. 24.
반응형


👇 문제 URL 👇

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


class Solution {
    public String solution(String new_id) {
        String answer = "";

        //1단계
        new_id = new_id.toLowerCase();
        System.out.println("1단계 :"+new_id);

        //2단계
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<new_id.length(); i++) {
            if (String.valueOf(new_id.charAt(i)).matches("[0-9a-z._-]")) {
                sb.append(new_id.charAt(i));
            }
        }
        new_id = sb.toString();
        System.out.println("2단계 :"+new_id);

        //3단계
        StringBuffer sb2 = new StringBuffer();
        int cnt = 0;
        for(int i=0; i<new_id.length(); i++) {

            if (new_id.charAt(i) == '.') {
                cnt++;

                if (cnt < 2) {
                    sb2.append(new_id.charAt(i));
                }
            } else {
                cnt = 0;
                sb2.append(new_id.charAt(i));
            }

        }

        new_id = sb2.toString();
        System.out.println("3단계 :"+new_id);

        if(new_id.charAt(0) == '.'){
            new_id = new_id.substring(1);
        }else if(new_id.charAt(new_id.length()-1) == '.'){
            new_id = new_id.substring(0, new_id.length()-1);
        }

        System.out.println("4단계 :"+new_id);

        if(new_id.length() == 0){
            new_id = "a";
        }
        System.out.println("5단계 :"+new_id);

        if(new_id.length() >= 16){
            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);
            }
        }
        System.out.println("6단계 :"+new_id);

        if(new_id.length() ==2 ){
           new_id = new_id + new_id.charAt(1);
        }else if(new_id.length() ==1){
            new_id = new_id + new_id.charAt(0) + new_id.charAt(0);
        }
        System.out.println("7단계 :"+new_id);

        answer = new_id;
        return answer;
    }
}


결과..


2단계만 정규식으로 풀었는데.. 찾아보니 3,4,5 단계도 정규식으로 풀엇어야 했다..
2단계도 좀 더 간단하게 표현이 가능했다.

new_id = new_id.replaceAll("[^0-9a-z._-]", "");

[]안에서 ^는 그 문자가 아닌것들을 얘기한다.

3단계는 아래와 같이 수정하였다.

new_id = new_id.replaceAll("[.]{2,}", ".");

[a]{2}이면 aa이고 [a]{2,}이면 a가 2개 이상이고, [a]{2, 4}이면 aa, aaa, aaaa 이다.

4단계는 아래와 같이 수정하였다.

new_id = new_id.replaceAll("^[.]|[.]$", "");

^ : 시작표시, $ : 끝표시
.으로 시작하거나 .으로 끝나면 ""로 치환한다.

6단계에서도 마지막이 .으로 끝나는지 체크할 때 정규식을 사용하는 것으로 수정하였다.

new_id = new_id.replaceAll("[.]$","");

최종 소스

class Solution {
    public String solution(String new_id) {
        String answer = "";

        //1단계
        new_id = new_id.toLowerCase();

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

        //3단계
        new_id = new_id.replaceAll("[.]{2,}", ".");
        
        //4단계
        new_id = new_id.replaceAll("^[.]|[.]$", "");
        
        //5단계
        if(new_id.length() == 0){
            new_id = "a";
        }
      
        //6단계
        if(new_id.length() >= 16){
            new_id = new_id.substring(0, 15);
            new_id = new_id.replaceAll("[.]$","");
        }

        //7단계
        if(new_id.length() ==2 ){
           new_id = new_id + new_id.charAt(1);
        }else if(new_id.length() ==1){
            new_id = new_id + new_id.charAt(0) + new_id.charAt(0);
        }

        answer = new_id;
        return answer;
    }
}


다 통과했다..! 정규식과도 좀 가까워질 필요가...있다....

728x90
반응형

댓글