본문 바로가기
Algorithm & SQL/programmers

2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천

by YoonJong 2022. 8. 7.
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

구현에 관련된 문제였다.

뭔가 정규식을 이용해서 풀면 되는것 같은데, 정규식을 잘 모르기도하고 노가다로 하나하나 구현하는 것도 문법공부 및 

구현관련해서 더욱 머리를 쓸수 있는 것 같았다.

 

해당 문제를 풀면서 구현에 관련된 문법? 은 사용해본것 같고, 머리도 많이 쓸수있는 문제였다.

아주좋은 문제같다.

 

막혔던 부분은 조건 3번이었다.

3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.

해당 조건에서 어떻게 구현해야할지 감이 안와서 다른 블로그를 보고 참고했다.

몇일지나고 다시한번 풀어보면서 익숙해지도록 해야겠다.

 

테스트는 전부 통과해서 제출을 했는데 처음에는 60점이 나왔다.

2번 조건에서 -20점 , 6번 조건에서 -20점이 되어서 디버깅과 블로그 참고를 통해 수정했다.

 

2번조건에서는 else if 없이 전부다 if 문에 때려박아서 틀렸었고,

6번조건에서는 조건이 애매한건지 내가 이해를 잘못했나보다.

6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.

여기서  " 제거 후 " 라고 해서 첫째줄 조건 안에다가 if 문을 추가했는데 여기서 감점을 받았다.

 

 

내 풀이

class Solution {
    public String solution(String new_id) {
        // 새로운 answer 에 조건에 맞는 값을 추가한다.
        String answer = "";

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

        //2단계 new_id 에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
        //여기서 차감 발생.
        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);
            }
        }

        //3단계 new_id 에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
        for (int i = 0; i < answer.length(); i++) {
            // . 을 찾았는데
            if (answer.charAt(i) == '.') {
                int j = i + 1;
                String dot = ".";

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

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

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.solution("...!@BaT#*..y.abcdefghijklm")); // bat.y.abcdefghi
        System.out.println(solution.solution("abcdefghijklmn.p")); // abcdefghijklmn
        System.out.println(solution.solution("z-+.^.")); // z--
        System.out.println(solution.solution("123_.def")); // 123_.def
        System.out.println(solution.solution("=.=")); // aaa

    }
}

 

정규식을 이용한 풀이

 정규식을 이용한 풀이는 문법과 함께 다시한번 확인해볼 필요가 있다.

class Solution {
    public String solution(String new_id) {
        String answer = new_id.toLowerCase(); // 1단계

        answer = answer.replaceAll("[^-_.a-z0-9]", ""); // 2단계
        answer = answer.replaceAll("[.]{2,}", "."); // 3단계
        answer = answer.replaceAll("^[.]|[.]$", "");    // 4단계
        
        if (answer.equals("")) {    // 5단계
            answer += "a";
        }

        if (answer.length() >= 16) {     // 6단계
            answer = answer.substring(0, 15);
            answer = answer.replaceAll("[.]$","");
        }

        if (answer.length() <= 2) {  // 7단계
            while (answer.length() < 3) {
                answer += answer.charAt(answer.length()-1);
            }
        }

        return answer;
    }
}
728x90

댓글