hoon's bLog

[Java] 프로그래머스 신규아이디 추천 자바 본문

코딩테스트/프로그래머스

[Java] 프로그래머스 신규아이디 추천 자바

개발한기발자 2022. 7. 5. 10:32
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

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

programmers.co.kr


느낌이 온다...

이건 정규식과 replace() 메서드 사용 각이닷!

 

[나의 풀이]

class Solution {
    public String solution(String new_id) {
        String answer = "";
        new_id = new_id.toLowerCase();
        for (int i=0; i<new_id.length(); i++) {
            //알파벳, 숫자, ".", "_", "-" 만 허용
            if(String.valueOf(new_id.charAt(i)).matches("[a-z0-9._-]")){
                answer += new_id.charAt(i);
            }
        }
        //.. -> .
        answer = answer.replaceAll("[.]{2,}", ".");
        //처음이나 끝에 위치하면 제거
        answer = answer.replaceAll("^[.]|[.]$","");
        if (answer.length() == 0){
            answer += "a";
        }
        //15자리까지 자르고, 끝에 . 제거
        if(answer.length() >= 16) {
            answer = answer.substring(0, 15);
            answer = answer.replaceAll("[.]$", "");
        }
        //2자 이하면 길이 3 될때 까지 반복
        if(answer.length() <= 2) {
            while(answer.length() < 3){
                answer += answer.charAt(answer.length()-1);
            }
        }
        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;
        }
    }
}

[정리]

- 정규식의 기본적인 문법만 알고 있다면 정말 많은 응용이 가능하다! 참 유용한 듯 ㅎㅎ

- 코드의 재사용성, 유지보수 관리 측면까지 고려한 내부클래스의 메서드 사용... 실무에서 많이 쓰이는 패턴 중 하나이기도 하다!

 

개인 피셜 난이도 : ★☆☆

단순히 테스트의 답만을 찾기 보단,

이렇게 다른 분들의 코드를 보며 리뷰하고, 내 소스와 비교해보면서

알아가는 재미가 쏠쏠하다.

늦게라도 시작한 코딩 테스트이지만,

계속해서 멈추지 않고,

꾸준히 내 갈길 가자!

 

끝.

728x90
반응형