Language/JAVA

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

paran21 2022. 1. 29. 22:30

https://programmers.co.kr/learn/courses/30/lessons/72410

class Solution {
    public String solution(String new_id) {
        String answer = new_id
                //1. 소문자로 치환
                .toLowerCase()
                //2. 알파벳 소문자, 숫자, -, _, . 제외하고 모든 문자 제거
                .replaceAll("[^\\.\\-_0-9a-z]", "")
                //3. 마침표.이 2번 이상 연속된 부분 하나로 치환
                .replaceAll("[.]+", ".");

        //4. 마침표가 처음이나 끝에 위치한다면 제거
        if (answer.startsWith(".")) answer = answer.substring(1);
        if (answer.endsWith(".")) answer = answer.substring(0, answer.length()-1);

        //5. 빈 문자열이라면 "a" 대입
        if (answer.isEmpty()) answer = "a";

        //6. 16자 이상이면 첫 15개의 문자를 제외한 나머지 제거
        //제거 후 마침표가 마지막에 위치한다면 마침표 제거
        if (answer.length() >= 16)
            answer = answer.substring(0, 15).endsWith(".") ?
                    answer.substring(0, 14) : answer.substring(0, 15);

        //7. 길이가 2자 이하라면 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 추가
        if (answer.length() <= 2) {
            char last = answer.charAt(answer.length()-1);
            while (answer.length() < 3) {
                answer += last;
            }
        }

        return answer;
    }
}

테스트 코드 사용하면서 계속 수정 변경했는데, 마지막에 15번 테스트를 통과하지 못했다.

다른 답안을 검색해보니 참고할만한 메소드가 많이 나와서 거의 그대로 정리하였다.

정규표현식은 아직 햇갈리는데

[^\\.\\-_0-9a-z]은

^은 not, \\.은 문자그대로 . \\-_은 \\-\\_을 합한 표현같다(바꿔서도 통과).