본문 바로가기

알고리즘 문제풀이/프로그래머스 Level 1

[2021 KAKAO BLIND RECRUITMENT/Java] 신규 아이디 추천

# 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

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

programmers.co.kr

 

목차

 

나의 풀이 포인트
  1. 정규표현식 사용

 

나의 문제풀이
class Solution {
    public String solution(String new_id) {
        String answer = new_id;
        
        // 1단계) new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
        answer = answer.toLowerCase();
        
        // 2단계) new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
        answer = answer.replaceAll("[^a-z0-9._-]","");
        
        // 3단계) new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
        answer = answer.replaceAll("[.]{2,}",".");
        
        // 4단계) new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
        answer = answer.replaceAll("^[.]|[.]$", "");
        
        // 5단계) new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
        if(answer.length() == 0){
            answer = "a";
        }
        
        // 6단계) new_id의 길이가 16자 이상이면, 
        // new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
        // 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
        if (answer.length() >= 16) {
            answer = answer.substring(0, 15);
            answer = answer.replaceAll("[.]$", "");
        }
        
        // 7단계) new_id의 길이가 2자 이하라면, 
        // new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
        if(answer.length() <= 2){
            char last = answer.charAt(answer.length()-1); // 마지막 문자
            
            while (answer.length() < 3) {
                answer += last;
            } 
        }
        
        return answer;
    }
}

 

프로그래머스 다른사람 풀이 참고(- , 최현준 , - , - /  링크)
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;
        }
    }
}

객체지향적으로 작성하신 게 매우 신기했다~~~!!! 충격적...

noGreaterThan16(), noLesThan2() 함수들은 16이랑 2를 파라미터로 받아서 처리하면 더 재사용성이 좋지 않을까 조심스레 생각해봅니다~~😉