Learn & Run

[Programmers] 신규 아이디 추천 (Java, Kotlin) 본문

Algorithm/Programmers

[Programmers] 신규 아이디 추천 (Java, Kotlin)

iron9462 2021. 8. 29. 13:30

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

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

문제

입력값으로 카카오 서비스에 가입하는 유저들의 아이디가 들어옵니다. 이 때, 카카오 아이디 규칙에 맞지않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천하여 반환하면 됩니다. 해당 규칙은 위의 문제에서 확인 가능합니다.

 

접근 아이디어

1. 문제에 명시된 단계별 규칙에 맞게 ID 값을 변환해 나갑니다.

2. 규칙중 2단계, 3단계는 정규식을 이용해도 되고, 직접 구현을 해도 가능합니다.

 

조심해야할 점

1. String Index에 직접적으로 참조할경우 IndexOutOfRangeException을 조심해야 합니다. (4단계 참고)

2. 7단계 규칙 적용시에 new_id의 마지막 문자를 길이가 3이될 때까지 반복해야합니다. 여기서 new_id가 길이가 1이라면 인덱스 1의 값을, 길이가 2라면 인덱스 2의 값을 반복해서 추가해야합니다.

 

 

- Java

class Solution {
    public String solution(String new_id) {
        //1단계: new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
        String answer = new_id.toLowerCase();

        //2단계: new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
        answer = answer.replaceAll("[^a-z0-9-_.]", "");

        //3단계: new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
        answer = answer.replaceAll("[.]{2,}",".");

        //4단계: new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
        char dot = '.';
        if (answer.charAt(0) == dot) answer = answer.substring(1, answer.length());
        if (answer.length() != 0 && answer.charAt(answer.length() - 1) == dot) {
            answer = answer.substring(0, answer.length() - 1);
        }

        //5단계: new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
        if (answer.isEmpty()) answer = "a";

        //6단계: new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
        if (answer.length() >= 16) answer = answer.substring(0, 15);
        if (answer.charAt(answer.length() - 1) == dot) answer = answer.substring(0, answer.length() - 1);
        
        //7단계: new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
        while(answer.length() <= 2) {
            answer += answer.charAt(answer.length() - 1);
        }
        return answer;
    }
}

 

 

- Kotlin

class Solution {
    fun solution(new_id: String): String {

        //1단계: new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
        var answer = new_id.toLowerCase()

        //2단계: new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
        val sb = StringBuilder()
        val regex = Regex("[a-z0-9-_.]")
        answer.forEach { it: Char ->
            if (regex.matches(it.toString())) sb.append(it)
        }
        answer = sb.toString()
        sb.clear()

        //3단계: new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
        val dot = '.'
        var count = 0
        for (index in answer.indices) {
            val compare = answer[index]
            if (compare == dot) {
                count++
                if (index == answer.length - 1) {
                    sb.append(compare)
                }
            } else {
                if (count > 0) {
                    count = 0
                    sb.append(dot)
                }
                sb.append(answer[index])
            }
        }
        answer = sb.toString()
        sb.clear()

        //4단계: new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
        if (answer[0] == dot) answer = answer.substring(1, answer.length)
        if (answer.isNotEmpty() && answer[answer.length - 1] == dot) {
            answer = answer.substring(0, answer.length - 1)
        }

        //5단계: new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
        if (answer.isEmpty()) answer = "a"

        //6단계: new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
        if (answer.length >= 16) answer = answer.substring(0, 15)
        if (answer[answer.length - 1] == dot) answer = answer.substring(0, answer.length - 1)

        //7단계: new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
        while(answer.length <= 2) {
            answer = answer.plus(answer[answer.length - 1])
        }

        return answer
    }
}

 

 

좌(Java 채점 결과), 우(Kotlin 채점 결과)