개발자가 되고 싶은 개발자

[Algorithm] 신규 아이디 추천 본문

Dev/Algorithm

[Algorithm] 신규 아이디 추천

Fullth 2021. 10. 7. 17:30

문제

 

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

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

programmers.co.kr

목표

- 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천

 

규칙

- 아이디의 길이는 3자 이상 15자 이하여야 합니다.
- 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
- 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

 

조건

- 네오가 설계한 7단계의 순차적인 처리 과정을 거쳐야 함
- 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
- 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
- 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
- 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
- 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
- 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
- 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

 

제한사항

- new_id는 길이 1 이상 1,000 이하인 문자열입니다.
- new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
- new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.

 

코드

class Solution {
    public String solution(String new_id) {

        String answer = "";

        // 1단계
        new_id = new_id.toLowerCase();

        // 2단계
        for(int i = 0; i < new_id.length(); i++) {
            char ch = new_id.charAt(i);
            if(ch >= 'a' && ch <= 'z')
                answer += String.valueOf(ch);
            else if (ch >= '0' && ch <= '9')
                answer += String.valueOf(ch);
            else if (ch == '-' || ch == '_' || ch == '.')
                answer += String.valueOf(ch);
        }

        String dot = ".";

        // 3단계
        for(int i = 0; i < answer.length(); i++) {
            if(answer.charAt(i) == '.') {
                int j = i + 1;
                while(j != answer.length() && answer.charAt(j) == '.'){
                    dot += '.';
                    j++;
                }
                if(dot.length() > 1) {
                    answer = answer.replace(dot, ".");
                    dot = ".";
                }
            }
        }

        // 4단계
        if(answer.startsWith(".") )
            answer = answer.substring(1, answer.length());
        else if(answer.endsWith("."))
            answer = answer.substring(0, answer.length()-1);

        // 5단계
        if(answer.length() == 0)
            answer += 'a';

        // 6단계
        if(answer.length() != 0 && answer.length() > 15)
            answer = answer.substring(0, 15);

        if(answer.endsWith("."))
            answer = answer.substring(0, answer.length()-1);

        // 7단계
        if(answer.length() <= 2) {
            char ch = answer.charAt(answer.length()-1);

            int length = answer.length();
            if(length == 2)
                answer += ch;
            else if (length == 1)
                answer = answer + ch + ch;
        }

        return answer;
    }
}

풀이

- 각 절차별로 기능을 작성하였다.

- 1단계: toLowerCase( )를 이용하여 소문자로 치환.

- 2단계: new_id를 한 자씩 확인하여 주어진 조건에 맞는 값만 answer변수에 추가한다.

- 3단계: 마찬가지로 한 자씩 확인하여 dot 변수에 연속하는 '.' 값을 저장해주고, 해당값을 '.'으로바꿔준다.

- 4단계: startsWith( )와 endsWith( ) 메소드를 사용하여 값을 잘라주어 answer변수에 대입한다.

- 5단계: 비어있는 문자열이라면 'a'값을 추가

- 6단계: 15자 이상이라면 잘라줌

- 7단계: 2자 이하라면 마지막 문자를 3자까지 추가해준다.

 

회고

- 여러 케이스를 생각하지 못해서 엄청 디버깅 하면서 풀었다. 실제 테스트였다면 시간을 엄청 허비했을 것이다.

- 물론 비효율적인 방법이라는 것은 알았지만, 문자열 다루는데 익숙하지 않은 것 같아 순차적으로 다뤄보았다.  (startsWith( ), endsWith( ) 이 두 메서드는 이번에 풀면서 알았다.)

- 비효율적인 방법이라는 것을 알았어도 이것말고는 못풀었을 것이다. (정규식을 거의 안써봤기 때문에...)

- 해서 아래 정규식을 사용한 풀이를 추가해두고 정규식을 따로 포스팅하려 한다.

 

정규식을 이용한 풀이(출처: 하단 링크)

    public String solution(String new_id) {
        String id = new_id.toLowerCase(); // 소문자로 
        id = id.replaceAll("[^-_.a-z0-9]", ""); //-_. 영문자 숫자만 남김 
        id = id.replaceAll("[.]{2,}", "."); // .2개 이상 .으로 
        id = id.replaceAll("^[.]|[.]$", ""); // 처음과 끝 . 제거 

        if(id.equals("")) // 빈 문자열이라면 a 추가 
            id += "a";
            
        if(id.length() >= 16){ // 16자 이상이면 15자로 
            id = id.substring(0, 15);
            id = id.replaceAll("^[.]|[.]$", ""); // 끝 . 제거 
        }
        if(id.length() <= 2) // 2자 이하라면 3자까지 마지막 문자추가 
            while(id.length() < 3)
                id += id.charAt(id.length() - 1);

        return id;
    }
 

[프로그래머스 - Java] 신규 아이디 추천 (2021 KAKAO BLIND RECRUITMNET)

문제 programmers.co.kr/learn/courses/30/lessons/72410 코딩테스트 연습 - 신규 아이디 추천 카카오에 입사한 신입 개발자 네오는 카카오계정개발팀에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디

minhamina.tistory.com