본문 바로가기
Beakjoon&프로그래머스/Java

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

by 현장 2026. 3. 17.

-Code

class Solution {
    public String solution(String new_id) {
        // 소문자 변경
        String lowerId = new_id.toLowerCase();
        StringBuilder answer = new StringBuilder();
        for (char ch : lowerId.toCharArray()) {
            // .이 반복될 경우 1개만 저장
            if (answer.length() > 0 &&
                    ch == '.' &&
                    answer.charAt(answer.length() - 1) == ch
            ) {
                continue;
            }
            // 영어, 숫자, -_.인경우 추가
            if (isOk(ch)) {
                answer.append(ch);
            }
        }
        // 처음이 .인 경우 삭제
        if (answer.length() > 0 && answer.charAt(0) == '.') {
            answer.delete(0, 1);
        }
        // 마지막이 .인 경우 삭제
        if (answer.length() > 0 && answer.charAt(answer.length() - 1) == '.') {
            answer.delete(answer.length() - 1, answer.length());
        }
        // 결과가 비어있는 경우 a 대입
        if (answer.length() == 0) answer.append('a');
        // 15글자 초과한 경우 자르기
        if (answer.length() > 15) {
            answer.delete(15, answer.length());
            // 마지막이 .인경우 .제거
            while (answer.charAt(answer.length() - 1) == '.') {
                int idx = answer.length();
                answer.delete(idx - 1, idx);
            }
        }
        // 글자수가 2이하인 경우 마지막 글자 3개가 될때까지 추가
        if (answer.length() < 3) {
            char lastChar = answer.charAt(answer.length() - 1);
            while (answer.length() < 3) {
                answer.append(lastChar);
            }
        }
        return answer.toString();
    }
    // 숫자, 영어, 특정 특수 문자만 허용하기 위한 메소드
    private boolean isOk(char c) {
        if (Character.isAlphabetic(c) || Character.isDigit(c)) {
            return true;
        }
        for (char check : "-_.".toCharArray()) {
            if (c == check) {
                return true;
            }
        }
        return false;
    }
}