[코테/JAVA] 2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천

    728x90
    반응형

    2021.04.19

    24일차

     

    입사 43일차.

    나는 일단 좋다 싶으면 시작한다.

    사서 일을 하거나 일을 벌여 놓는 스타일이라는 뜻이다.

     

    현재 진행중인 리액트를 이용한 ToDoList, 학교후배와 진행하는 하이브리드 웹 프로젝트를 퇴근시간과 주말을 이용하여 진행중인데 남는 시간에 백준, 프로그래머스, 코드업에서 문제를 풀어보기로 했다.

     

     

    1. 문제

    문제 설명

    카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로 가입하는 유저들이 카카오 아이디 규칙에 맞지 않는 아이디를 입력했을 때, 입력된 아이디와 유사하면서 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것입니다.
    다음은 카카오 아이디의 규칙입니다.

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

    "네오"는 다음과 같이 7단계의 순차적인 처리 과정을 통해 신규 유저가 입력한 아이디가 카카오 아이디 규칙에 맞는 지 검사하고 규칙에 맞지 않은 경우 규칙에 맞는 새로운 아이디를 추천해 주려고 합니다.
    신규 유저가 입력한 아이디가 new_id 라고 한다면,

    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이 될 때까지 반복해서 끝에 붙입니다.

     

    크게 어렵지 않은 문제다.

    이런 문제들을 풀때는 코딩테스트에 유용한 메소드들을 많이 사용해보고 필요할때 가져다 쓰면 된다.

     

     

     

    2. 풀이

    class Solution {
        public String solution(String new_id) {
            String answer = new_id;
            
            // 1단계(소문자로 변환)
            // String변수명.toLowerCase(); 를 사용하면 문자열안의 대문자를 찾아서 소문자로 변환시켜준다. 
            answer = answer.toLowerCase();

            // 2단계(특수문자 제거)
            // 정규표현식을 사용한다. 문제에서 소문자, 숫자, 특수문자( '-', '_', '.' ) 만을 허용했기 때문에, Not을 뜻하는 ^를 사용
            // 일치하지 않는 문자들을 ""로 치환

            String chk2 = "[^a-z0-9-_.]";
            answer = answer.replaceAll(chk2, "");

            // 3단계(연속된 .제거)
            // [ ]뒤의 {n, }는 괄호안의 문자의 최소반복횟수를 뜻한다. 최소2번이상 반복되면 반복되는 모든 문자들을 치환하는 방법
            String chk3 = "[.]{2,}";
            answer = answer.replaceAll(chk3, ".");

            // 4단계(첫,마지막 글자 .제거)
            // ^[ ]는 시작문자, [ ]$는 끝문자를 뜻한다. 일치할 경우 치환하는 방식을 사용했다.
            String chk4 = "^[.]|[.]$";
            answer = answer.replaceAll(chk4, "");

            // 5단계(빈 문자열이면 'a')
            // 내가 이 문제를 포스팅하게 된 계기다. 이클립스에서 answer == ""를 작성했을 때 제대로 작동했지만
            // 프로그래머스에서는isEmpty()만 제대로 작동한다.

            if(answer.isEmpty())  answer = "a"; 

            // 6단계(15자까지 표시)
            // substring(시작Index, 끝Index)를 사용해서 15자리까지만 표시하도록 문자열을 잘랐다.
            if(answer.length() >= 16) {
                answer = answer.substring(0, 15);

                String chk6 = "[.]$";
                answer = answer.replaceAll(chk6, ""); }

            // 7단계(2자리 이하면 마지막글자를 반복)
            // charAt( Index )은 Index에 해당하는 문자 1개를 표시한다.
            // Index는 0부터 시작하므로, (문자열의 총 길이 - 1) 은 마지막을 표시하는 Index 이다.

            while (answer.length() < 3) {
                answer += answer.charAt(answer.length()-1);
            }

            return answer;
        }
    }

     

     

    isEmpty() 때문에 소중한 30분이 날아가버렸다.

    실제 코딩테스트에 참여했다면 1문제를 더 풀 수 있는 시간을 날려버린셈이다.

     

    조금 더 유연하게 대처하지 못한 나에게 화가 나는 문제였다,

    728x90
    반응형

    댓글