프로그래머스/코딩테스트

프로그래머스 문제 풀기 #신규 아이디 추천

선물공룡디보 2021. 11. 26. 13:19

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

 

내가 푼 정답 :

function solution(new_id) {
    var answer = '';
    //1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
    //2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
    //3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
    //4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
    answer = new_id.toLowerCase()
      .replace(/[\^\[\]]|[^A-z0-9\.\_\-]/g,"")
      .replace(/\.{2,}/g,".")
      .replace(/^\.+|\.+$/g,"");
    if(answer.length < 1 ){
        answer = 'a';
    }
    if ( answer.length >= 16){
        answer = answer.slice(0, 15).replace(/\.+$/g,"");;
    }
    if( answer.length <= 2){
      
        for(var i = 0 ; i < answer.length ; i ++){
            answer += answer[answer.length-1];
            if(answer.length == 3){
                break;
            }
        }
    }
   
    return answer;
}

ID를 받았을때  단계별마다 필요한 정규식을 .replace 메서드를 메서드 체이닝으로 연결시켜 문자를 변경 시킵니다.
그 후 문자열의 크기 조건을 맞추어 값을 반환 하였습니다.

 

다른사람의 풀이 :

const solution = (new_id) => {
    const id = new_id
        .toLowerCase()
        .replace(/[^\w\d-_.]/g, '')
        .replace(/\.{2,}/g, '.')
        .replace(/^\.|\.$/g, '')
        .padEnd(1, 'a')
        .slice(0, 15)
        .replace(/^\.|\.$/g, '')        
    return id.padEnd(3, id[id.length-1])
}

나는 정규식을 a-zA-Z0-9 으로 사용 했는데, 이 풀이는 \w (문자열) \d (숫자) -_. /g  로 정규식을 사용하였다.
padEnd 메서드를 사용하여 문자열이 없을때 n-1 번째 인덱스에 'a' 문자열을 삽입하는 부분이 인상 깊었다.
또한 padEnd를 사용하여 문자열을 채우는 방법도 좋은 방법인듯 하다