본문 바로가기
Memo/코테

[Kakao] 신규 아이디 추천

by 연로그 2021. 5. 26.
반응형

2021 KAKAO BLINDTEST 난이도 1

신규 아이디 추천

 

문제 요약

> 사용자가 입력된 아이디를 기준에 맞는 아이디로 변경

 

기준

  • 3<=id<=15
  • 소문자, 숫자, -, _, .
  • .는 처음/끝/연속 X

 

변경 순서

  1. 대->소
  2. 소문자, 숫자, -, _, . 외 문자 제외
  3. .가 연속이면 하나로
  4. .가 처음/끝이면 제외
  5. 빈문자열이면 "a"
  6. 16자 넘으면 15자까지만 자르기 + .가 마지막이면 그것도 자르기
  7. 2자 이하면 마지막 문자를 길이 3될때까지 반복

내 풀이

class Solution {
    public String solution(String new_id) {
        //step 1
        new_id = new_id.toLowerCase();
        
        //step 2
        new_id = replaceNotLetter(new_id);
        
        //step 3
        new_id = duplicateDot(new_id);
        
        //step 4
        new_id = isStartEndWithDot(new_id);
        
        //step 5
        new_id = isEmptyStr(new_id);
        
        //step 6
        new_id = isOverThan15(new_id);
        new_id = isStartEndWithDot(new_id);
        
        //step 7
        new_id = isLessThan2(new_id);
        
        return new_id;
    }
    
    // 유효하지 않은 문자 제거
    public String replaceNotLetter (String str) {
        return str.replaceAll("[^a-z0-9_.-]", "");
    }
   
    // .가 연속이면 하나로
    public String duplicateDot (String str) {
        return str.replaceAll("[.]{2,1000}", ".");   
    }

    // .가 처음/끝에 있으면 제거
    public String isStartEndWithDot (String str) {
        if(str.startsWith(".")) str = str.substring(1,str.length());
        if(str.endsWith(".")) str = str.substring(0, str.length()-1);
        return str;
    }
    // 빈 문자열이면 "a"
    public String isEmptyStr (String str) {
        if("".equals(str)||str==null) return "a";
        else return str;
    }
    
    // 글자수 조절
    public String isOverThan15 (String str) {
        if(str.length()>15) return str.substring(0,15);
        return str;
    }
    
    // 2자 이하면 마지막 문자 추가
    public String isLessThan2 (String str) {
        int len = str.length();
        if(len>2) return str;
        
        String last = str.substring(len-1,len);
        if (len==2) return str+last;
        else return str+last+last; 
    }
}

 

난이도는 막 어렵지 않은데 정규식 공부한걸 메모하기 위해 글을 따로 작성한다.

  • ^[A]: A로 시작하는 글자
  • [^A]: A가 아닌 모든 글자
  • A{2,5}: AA, AAA, ..., AAAAA의 의미로 A가 2~5회 반복
  • A{2,}: A가 2회 이상 반복
  • [A]$: A로 끝나는 글자
  • | : OR

 

다른 사람 코드

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;
        }
    }
}

풀이 자체는 비슷한데 구성이 훨씬 깔끔하다ㅜㅜㅜㅜ

JAVA는 객체 지향적인 언어인데 왜 자꾸 난 코테만 보면 객체의 존재를 까먹게 될까..

반응형

'Memo > 코테' 카테고리의 다른 글

프린터  (0) 2021.06.22
방문 길이  (0) 2021.06.16
[Codility] CountDiv  (0) 2021.04.22
[Codility] TapeEquilibrium  (0) 2021.04.21
[Codility] PermMissingElem  (0) 2021.04.20