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

강동준·2022년 1월 25일
0

코딩테스트

목록 보기
1/6

친한 개발자 형과 사이드 프로젝트를 시작하기 전 하기 시작한 코딩테스트의 첫 번째 문제

문제를 보자마자 정규표현식을 써야겠다는 생각은 떠올랐으나 열심히 구글링을 해서 문제를 제출했다.

하지만 미리 작성되어 있는 테스트 케이스는 통과했지만 정작 제출을 하니 16번과 20번 케이스에서 실패가 나옴

실패의 원인이 된 코드

if(new_id.length() >= 16){
            new_id = new_id.substring(0, 15);
            if(new_id.indexOf(".") == new_id.length() - 1){
                new_id = new_id.substring(0, new_id.length() -1);
            }
        }

마지막 문자가 "." 일 경우를 indexOf() 메소드를 사용해서 찾아냈던 것이 원인

"." 이 마지막이 아니라 그 앞에 있을 경우에 해당 위치를 반환하기 때문에 계속해서 통과를 못했던 것...

정답 코드

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Solution {
    public String solution(String new_id) {
        String answer = "";

        // 대문자를 소문자로 치환
        new_id = new_id.toLowerCase();
        
        // 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
        new_id = new_id.replaceAll("[^a-z0-9\\.\\-\\_]", "");
                
        // 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환
        new_id = new_id.replaceAll("\\.{2,}", ".");
                
        // 마침표가 처음 혹은 끝에 위차한 경우 제거
        new_id = new_id.replaceAll("^[.]|[.]$", "");
        
        // new_id가 빈 문자열일 경우 a를 대입
        if(new_id.equals("")){
            new_id = "a";
        }
        
        // 문자열의 길이가 16자 이상이면 15자까지 자르고, 마지막 문자가 .인 경우 제거
         if(new_id.length() >= 16){
             new_id = new_id.substring(0, 15);
             new_id = new_id.replaceAll("[.]$", "");
         }
                
        // new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙인다.
        if(new_id.length() <= 2){
            while(new_id.length() < 3){
                String tempValue = new_id.substring(new_id.length()-1);
                System.out.println(tempValue);
                new_id = new_id + tempValue;
            }
        }
        
        answer = new_id;
        
        
        
        return answer;
    }
}

다른 사람 풀이(JAVA 코드 다운 정답)

코딩테스트 문제냐 아니냐는 건너뛰고 정말 JAVA 스러운 코드

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

공부하자

profile
성장을 멈추지 않는 백엔드개발자입니다.

0개의 댓글