ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - 신규 아이디 추천 [자바]
    Algorithms/- 프로그래머스 2022. 1. 29. 23:11

    문제 링크 : 신규 아이디 추천

    코딩테스트 연습 - 신규 아이디 추천

    카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

    programmers.co.kr

    정답

    class Solution {
        public String solution(String new_id) {
            //1단계 소문자 치환
            new_id = new_id.toLowerCase();
    
            //2단계 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 문자를 제거
            String temp_id = "";
            char[] charArr = new_id.toCharArray();
            for(char id : charArr){
                if(id >= 'a' && id <= 'z'){
                    temp_id += String.valueOf(id);
                }else if(id >= '0' && id <= '9'){
                    temp_id += String.valueOf(id);
                }else if(id == '-' || id == '_' || id == '.'){
                    temp_id += String.valueOf(id);
                }
            }
            new_id = temp_id;
            System.out.println("점 제거 전 : " + new_id);
    
            //3단계 하나의 마침표로 치환
            temp_id = "";
            charArr = new_id.toCharArray();
            boolean dotFlag = false;
            //a..b -> a.b
            for(char id : charArr){
                if(id != '.'){
                    temp_id += String.valueOf(id);
                    dotFlag = false;
                }else if(id == '.' && dotFlag == false){
                    //.이라면 뒤에 .이 안 올때까지 + 안하면 됨 그걸 flag로 구분
                    temp_id += String.valueOf(id);
                    dotFlag = true;
                }
            }
            new_id = temp_id;
            System.out.println("점 제거 후 : " + new_id);
    
            //4단계 처음과 끝 . 이면 제거
            if(new_id.startsWith(".")){
                new_id = new_id.substring(1);
                System.out.println("시작 점 제거 후 : " + new_id);
            }
            if(new_id.endsWith(".")){
                new_id = new_id.substring(0, new_id.length() - 1);
                System.out.println("마지막 점 제거 후 : " + new_id);
            }
    
            //5단계 빈 문자열이면 a를 대입
            if(new_id.equals("")){
                new_id += "a";
            }
    
            //6단계 16자 이상이면 15개 이후 삭제 제거후 마지막이 . 이면 제거
            if(new_id.length() >= 16){
                new_id = new_id.substring(0, 15);
                System.out.println("15자리 컷 : " + new_id+ " " + new_id.length());
                if(new_id.endsWith(".")){
                    new_id = new_id.substring(0, 14);
                    System.out.println("마지막 자리 컷 : " + new_id);
                }
            }
    
            //7단계 2자 이하이면 마지막 문자를 길이가 3되도록 끝에 붙임
            String endStr = "";
            if(new_id.length() <= 2){
                endStr = new_id.substring(new_id.length() - 1);
                while(new_id.length() < 3){
                    new_id += endStr;
                }
            }
    
    
            System.out.println(new_id);
    
    
            return new_id;
        }
    }

    분석

    • 제거하는 것보다 허용된 것을 남기는 것이 더 쉽다.
    • 제공된 규칙에 따라서 코딩하였는데 정규식을 활용하는게 더 나아보인다.

    참고할 만한 정답

    • 정규식을 사용하여 훨씬 깔끔하다.
    class Solution {
        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;
        }
    }

    정규 표현식(Regular Expressions)


    정규 표현식(regex) : 설명

    . : 임의의 한 문자(단 \는 넣을 수 없음)
    ^regex : 문자열의 시작이 regex인지
    regex$ : 문자열의 끝이 regex인지
    * : 앞 문자가 없을 수도 무한정 많을 수도 있음
    + : 앞 문자가 하나 이상
    ? : 앞 문자가 없거나 하나 있음
    [ ] : 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다.
    ([^abc] 처럼 ^로 시작하면 not을 나타낸다.)
    [abc] : a,b,c중 1개 인지
    [abc][vz] : a,b,c중 문자 1개와 v,z중 문자 1개의 조합인지
    [^abc] : a,b,c를 제외한 문자 1개
    { } : 횟수 또는 범위를 나타낸다.
    ( ) : 소괄호 안의 문자를 하나의 문자로 인식
    | : or 연산자로 인식
    X|Z : X 또는 Z
    \ : 정규 표현식 역슬래쉬(\)는 확장문자
    \d를 표현하려면 \\d로 표현해야 한다.
    \b : 단어의 경계
    \B : 단어가 아닌것에 대한 경계
    \A : 입력의 시작 부분
    \G : 이전 매치의 끝
    \Z : 입력의 끝이지만 종결자가 있는 경우
    \z : 입력의 끝
    \s : 공백 문자
    \S : 공백 문자가 아닌 나머지 문자
    \w : 알파벳이나 숫자
    \W : 알파벳이나 숫자를 제외한 문자
    \d : 숫자 [0-9]와 동일
    \D : 숫자를 제외한 모든 문자
    (?i) : 앞 부분에 (?!)라는 옵션을 넣어주게 되면 대소문자는 구분하지 않습니다.

    참조

    Java 정규표현식 Pattern 사용법

    반응형

    댓글

Designed by Tistory.