티스토리 뷰

 

[Java/Programmers]

Lv.1 신규 아이디 추천

(2021 KAKAO BLIND RECRUITMENT)

 

 

⬇︎ ⬇︎ ⬇︎ 문 제 링 크 ⬇︎ ⬇︎ ⬇︎

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

 

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

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

programmers.co.kr

 

 


 

 

입/출력

 

(입력)

신규 유저가 입력한 아이디 : new_id

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

 

(출력)

"네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return

 

 

풀이

 

⭕️ ver.1 : 처음 제출한 코드

public static String solution(String new_id) {
        String answer = "";

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

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

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

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

        // 5단계 : new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
        if(answer.equals("")) {
            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) == '.') {
                answer = answer.substring(0, answer.length() - 1);
            }
        }

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

        return answer;
 }

- 아직 정규식 문법을 많이 알진 못해서 푸는데 검색도 많이 하고 (정규식 문법 관련) 헤맸다...

- 답안을 보지 않고 정규식 문법만을 검색하다 보니 내가 원하는 검색 결과는 나오지 않아서 그냥 혼자서 땅파고 테스트돌려보다가 해결...

- 특히 2단계에서는 모든 조건이 아닐때 그냥 앞에 ^ 하나만 해주면 되는걸 몰라 헤메고, 3단계에서는 2번 이상 . 이 연속된다는 것을 정규식으로 표현할 줄 몰라서 헤멨다....

 

 

⭕️ ver.2 : 다른분들 풀이 보고 조금 개선한 코드

public static String solution(String new_id) {
        String answer = "";

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

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

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

        // 4단계 : new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
        answer = answer.replaceAll("^[.]|[.]$", "");

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

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

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

        return answer;
}

- 분명 위에서 2,3단계 해결하려고 정규식 문법 찾아볼때 ^는 문자열의 시작을 의미하고, $이 문자열의 끝을 의미하는거라는 걸 알게되었는데 활용하지 못하고 if문으로 해결해버리는 무지함...^^

- 프로그래머스에서 다른분들 풀이한 것 보니까 팩토리 쓰셔서 푸신 분도 계시고 진짜 다양한 풀이법이 있었는데, 그중에서도 처음과 끝이 마침표일 경우 없애주는 부분을 정규식으로 간단하게 해결할 수 있어서 내 코드도 개선해보았다.

- 첫번째 풀이보다 훨씬 간단해보여서 뿌듯... ^__^

 

 

후기

생각보다 정규식을 활용해서 푸는 코테 문제가 많은 것 같아 정규식 연습을 많이 해둬야겠다고 느꼈다.

전에는 정규식이 마냥 어렵게 느껴지고 되도록이면 사용 안 했는데 계속 접하다보니 너무 편하고 익숙해지는 것 같다. 확실히 문자열 필터링 할 때 유용한 것 같아서 프로젝트 할 때도 많이 쓸 것 같다!

 

 

댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday
공지사항
최근에 올라온 글