STUDY/코딩테스트 문제풀이

[프로그래머스] 코딩테스트 문제 풀이(신규아이디추천)

수밤바 2021. 6. 3. 15:13
728x90

 

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

 

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

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

programmers.co.kr

 

 

 

 

프로그래머스에서 코딩테스트 연습

규격에 맞지 않는 아이디를 입력했을경우 규칙에 맞게 변경하여 추천하는 기능이다

 

이 연습으로 정규식을 공부하게된 좋은 경험이였다

 

내가 제출한 답안 

모든것을 함수화하여 만들었다....

    function solution(new_id) {
        var answer = new_id;
        answer = changeLowercase(answer);
        answer = removeEtcChar(answer);
        answer = removeDoubleDot(answer);
        answer = removeSideDot(answer);
        answer = isblank(answer);
        answer = checkLangth(answer);
        answer = removeSideDot(answer);
        answer = checkLangthShort(answer);
        return answer;
    }

 

    // 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
    function changeLowercase(id) {
        let strArr = id.split('');
        let lowcaseStr = strArr.map(el=>{
            el = el==el.toUpperCase() ?el.toLowerCase() : el ;
            return el;
        });
        return lowcaseStr.join('');
    }

=> 굳이.... 문자를 모두 쪼개어 하나씩 비교하여 소문자로 바꿀필요가.... 없었따.....

그냥

new_id.toLowerCase()   

이럼 모든문자 변경이 된다..ㅎ...

8줄->1줄 ㅎㅎㅎ

다른 사람들의 풀이를 보면서 공부가 많이되었다.

이런게 코딩테스트의 묘미!

 

 

    // 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
    function removeEtcChar(id){
        let regExp = /[^a-z0-9\-\_\.]/g;
        var rst = id.replace(regExp,'');
        return rst;
    }

=> 여기서부터 정규식 공부하면서 하나하나 적용해 봤다.

String.prototype.replace() : 어떤 패턴에 일치하는 부분이 교체되어 새로운 문자열 반환

/[^a-z0-9\-\_\.]/g

/[^a-z0-9\-\_\.]/g a부터 z까지

/[^a-z0-9\-\_\.]/g 0부터 9

/[^a-z0-9\-\_\.]/g 특수문자-,_,. 를

/[^a-z0-9\-\_\.]/g 제외(^)하고 공백으로('') 치환

 

 

=== 다른 사람들의 풀이 ===

/[^\w-_.]/g

/[^\w-_.]/g : a-zA-Z_ ( 영문 대소문자 52개 + 숫자 10개 + _)

/[^\w-_.]/g : -_. : - _ .

 

/[^\w\d-_.]/g

/[^\w\d-_.]/g : a-zA-Z_ ( 영문 대소문자 52개 + 숫자 10개 + _)

/[^\w\d-_.]/g : 0-9 (숫자)

/[^\w\d-_.]/g : - _ .

 

/[^a-z0-9\-_.]/g

 

 

    // 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
    function removeDoubleDot(id){
        let regExp = /[\.]{2,}/g;
        var rst = id.replace(regExp,'.');
        return rst;
    }

/[\.]{2,}/g 

/[\.]{2,}/g : 특수문자 . 이 

/[\.]{2,}/g : 2개이상 연속적으로 일치할 경우

=== 다른사람들의 풀이 ===

.replace(/\.\.+/g, '.')

.replace(/\.+/g,".")

.replace(/[.]+/g, ".");

 

 

 

    // 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
    function removeSideDot(id){
        let regExp = /^\.|\.$/g;
        var rst = id.replace(regExp,'');
        return rst;
    }

/^\.|\.$/g

/^\.|\.$/g : 문자 첫번째에 . 이 있을경우

/^\.|\.$/g : 이거나

/^\.|\.$/g : 문자 마지막에 . 이 있을경우

 

 

 

    // 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
    function isblank(id){
        let rst = id.length == 0 ? 'a':id;
        return rst;
    }

length가 0이면 a, 아니면 가져온 id


=== 다른사람들의 풀이 ===

.replace(/^$/, 'a') : 시작이 끝일경우! 크으으으 o_ob

.padEnd(1,'a') : 1번째 문자열을 a로 변환! 크으으으으으 o_ob

 

String.prototype.padEnd();

: 현재 문자열에 다른 문자열을 채워 주어진 길이를 만족하는 새로운 문자열을 반환

var text ='일이삼사오육';
text.padEnd(10,'*'); // "일이삼사오육****"

 

 

 

    // 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
    function checkLangth(id){
        let rst = id.substring(0,15);
        return rst;
    }


=== 다른사람들의 풀이 ===
.slice(0, 15)
answer.substr(0,15);

.match(/^.{0,14}[^.]/)[0]

 

String.prototype.match()

: 문자열이 정규식과 매치되는 부분 검색

 

 

    //     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
    // 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
    function checkLangthShort(id){
        var lastStr = id.substr(id.length-1, 1);
        var rst = '';
        if(id.length <3) rst = id + lastStr.repeat(3-id.length);
        return id + rst;
    }


=== 다른사람들의 풀이 ===

const len = answer.length;

return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);

 

.padEnd(3, id[id.length-1])