새소식

반응형
250x250
Programmers/Lv.1

프로그래머스 - 신규 아이디 추천

  • -
728x90
반응형

 

이번 문제는 replaceAll() 메소드와 정규표현식을 사용하는 문제였다.

 

그리 어렵다고 느껴지는 문제는 아니었다.

 

전체 코드를 보자.

class Solution {
    public String solution(String new_id) {
        new_id = new_id.toLowerCase();
        new_id = new_id.replaceAll("[^\\w-_.]", "");
        new_id = new_id.replaceAll("\\.+", ".");
        if(new_id.charAt(0) == '.') new_id = new_id.substring(1);
        if(new_id.length() != 0) {
            if(new_id.charAt(new_id.length() - 1) == '.') new_id = new_id.substring(0, new_id.length() - 1);
        }
        if(new_id.length() == 0) new_id = "a";
        if(new_id.length() >= 16) new_id = new_id.substring(0, 15);
        while(new_id.length() <= 2) {
            new_id = new_id + new_id.charAt(new_id.length() - 1);
        }
        if(new_id.length() != 0) {
            if(new_id.charAt(new_id.length() - 1) == '.') new_id = new_id.substring(0, new_id.length() - 1);
        }
        return new_id;
    }
}

 

사실 나는 뭐 객체지향스럽게 풀었다거나 그런 것도 아니었다.

 

그렇다고 정규표현식을 잘 활용한 것도 아니었는데 그냥 어거지로 끼워 맞춘 느낌..?

 

그런데 다른 사람이 풀이한 것을 보고 깜짝 놀랬다.

 

완전 객체지향스럽게 푼 풀이여서 이렇게 생각을 하고 풀 수도 있구나 하고 감탄했다.

 

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

 - , 최현준 , 양보은 , 최지원 외 1 명 의 풀이

 

이런 코드들을 많이 본 후 문제에 접근할 때 어떻게 하면 조금 더 객체지향적으로 문제를 해결할 수 있는지

고민을 하는 시간을 가져봐야겠다..

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.