Algorithm/프로그래머스

신규 아이디 추천

문제 파악 및 재정의


아이디 규칙에 맞지 않는 아이디를 입력하였을 때, 입력된 아이디와 유사하며 규칙에 맞는 아이디 추천
아이디 길이 3 ~ 15
아이디는 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표 문자만 사용가능
마침표는 처음과 끝에 사용할 수 없으며 연속으로 사용 불가

단계
1. 소문자 치환
2. 알파벳 소문자, 숫자, -, _, . 제외한 모든 문자 제거
3. 마침표(.) 2번 이상 연속된 부분을 하나의 마침표로 치환
4. 마침표(.)가 처음이나 끝에 위치한다면 제거
5. 빈 문자열이라면 "a"를 대입
6. 길이가 16자 이상이라면 첫 15문자를 제외한 나머지 문자들을 모두 제거
만약 제거 후 마침표(.)가 끝에 위치한다면 끝에 위치한 마침표 문자를 제거
7. 길이가 2자 이하라면 마지막 문자를 길이가 3이 될 때 까지 반복해서 끝에 붙임


자료구조 및 알고리즘 선택

단계 따라하기

 

구현

class Solution {
    public String solution(String new_id) {
        StringBuilder sb = new StringBuilder();
        String regex = "-_.~!@#$%^&*()=+[{]}:?,<>/";
        new_id = new_id.toLowerCase();
        new_id = new_id.replaceAll("[\\~!@#$%^&*()=+\\[{\\]}:?,<>\"/]", "");
        new_id = new_id.replaceAll("\\.{2,}", ".");
        
        if(new_id.isEmpty()) new_id = "a";
        if(new_id.length() < 2) {
            if(new_id.charAt(0) == '.') new_id = "";
        } else {
            char first = new_id.charAt(0);
            char last = new_id.charAt(new_id.length()-1);
            if(new_id.length() == 2) {
                if(first == '.') new_id = new_id.replaceFirst(".", "");
                if(last == '.') new_id = new_id.replaceFirst(".","");
            } else {
                if(first != '.') sb.append(first);
                sb.append(new_id.substring(1,new_id.length()-1));
                if(last != '.') sb.append(last);
                new_id = sb.toString();
                sb.delete(0, sb.length());
            }
        }

        if(new_id.isEmpty()) new_id = "a";
        if(new_id.length() > 15) {
            sb.append(new_id.substring(0, 15));
            new_id = sb.toString();
            sb.delete(0, sb.length());
        }
        while(new_id.charAt(new_id.length()-1) == '.') {
            new_id = new_id.replaceAll("\\.$", "");
        }
        
        while(new_id.length() < 3){
            char temp = new_id.charAt(new_id.length()-1);
            new_id += temp;
        }

        return new_id;
    }
}

 

회고

String에 내장된 함수와 정규표현식을 이용해서 해결했다.

다른사람 풀이 

최현준님

class Solution {
    public String solution(String new_id) {

        String s = new KAKAOID(new_id)
                .replaceToLowerCase()
                .filter()
                .toSingleDot()
                .noStartEndDot()
                .noBlank()
                .noGreaterThan16()
                .noLessThan2()
                .getResult();

        return s;
    }

    private static class KAKAOID {
        private String s;

        KAKAOID(String s) {
            this.s = s;
        }

        private KAKAOID replaceToLowerCase() {
            s = s.toLowerCase();
            return this;
        }

        private KAKAOID filter() {
            s = s.replaceAll("[^a-z0-9._-]", "");
            return this;
        }

        private KAKAOID toSingleDot() {
            s = s.replaceAll("[.]{2,}", ".");
            return this;
        }

        private KAKAOID noStartEndDot() {
            s = s.replaceAll("^[.]|[.]$", "");
            return this;
        }

        private KAKAOID noBlank() {
            s = s.isEmpty() ? "a" : s;
            return this;
        }

        private KAKAOID noGreaterThan16() {
            if (s.length() >= 16) {
                s = s.substring(0, 15);
            }
            s = s.replaceAll("[.]$", "");
            return this;
        }

        private KAKAOID noLessThan2() {
            StringBuilder sBuilder = new StringBuilder(s);
            while (sBuilder.length() <= 2) {
                sBuilder.append(sBuilder.charAt(sBuilder.length() - 1));
            }
            s = sBuilder.toString();
            return this;
        }

        private String getResult() {
            return s;
        }
    }
}

'Algorithm > 프로그래머스' 카테고리의 다른 글

혼자서 하는 틱택토  (0) 2023.03.16
푸드 파이트 대회  (0) 2023.02.28
가장 가까운 같은 글자  (0) 2023.02.28
[프로그래머스] 부족한 금액 계산하기  (0) 2021.08.11
[프로그래머스] 상호 평가  (0) 2021.08.11