[Lv1]신규 아이디 추천

Creating the dots·2022년 1월 7일
0

Algorithm

목록 보기
46/65

프로그래머스

이번 문제는 해결하지 못해 프로그래머스에서 다른 분이 작성하신 정규표현식 풀이법을 단계별로 정리해보았습니다.

답안코드

function solution(new_id) {
    const answer = new_id
        .toLowerCase() // 1단계
        .replace(/[^\w-_.]/g, '') // 2단계
        .replace(/\.+/g, '.') // 3단계
        .replace(/^\.|\.$/g, '') // 4단계
        .replace(/^$/, 'a') // 5단계
        .slice(0, 15).replace(/\.$/, ''); // 6단계
    return answer.padEnd(3, answer[answer.length-1]); // 7단계
}

1단계

new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
toLowerCase()

2단계

new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄, 마침표(.)를 제외한 모든 문자를 제거합니다.
replace(searchValue: string|RegExp, replaceValue: string)
replace(/[^\w-_.]/g), ''

  • 첫번째 인자로 교체 대상이 되는 문자열 또는 정규식을 입력받고, 두번째 인자로 교체되어 들어갈 문자열을 입력받아 교체된 문자열을 리턴한다.

  • 정규식은 /정규식/의 형태로 작성한다.

  • [] 안에 들어가는 문자열은 문자셋이라고 하고, ., *도 특수문자 취급받지 않고 문자로 취급된다.

  • [^문자셋]와 같이 문자열이 문자셋이 ^로 시작하면, 부정 문자셋을 의미하며, 뒤에 나오는 문자셋을 제외한 문자가 대응된다.

  • \w[A-Za-z0-9_]와 동일하며 영문자(소문자, 대문자), 숫자, 밑줄을 포함한다.

  • /정규식/g는 정규식 뒤에 붙는 문자는 검색옵션을 지정할 수 있다. g는정규식에 해당하는 문자를 한번만 찾고 끝나는게 아니라 조건에 맞는 모든 문자를 찾을 수 있다.

3단계

new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
replace(/\.+/g, '.')

  • \.은 이스케이프 문자 \과 함께 사용해 마침표 . 특수문자가 아닌 문자열로서 사용할 수 있습니다. ([] 안에서는 이스케이프 없이 사용가능)

  • ++ 기호 앞 문자가 1회 이상 반복되는 것을 의미한다.

4단계

new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
replace(/^\.|\.$/,'')

  • ^이 문자셋 안에서 사용되면 부정의 의미를 가졌지만, //에서 사용되면 시작을 의미한다.
  • |는 '또는'(or)의 의미를 갖는다.
  • $는 끝을 의미한다. $ 앞에 쓰인 문자로 끝나는지를 확인한다.

5단계

new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.'
replace(/^$/, 'a')

  • 4단계에서 사용된것처럼 //안에서 ^는 시작을 의미하며 $는 끝을 의미한다. 따라서, 시작과 끝 사이에 아무 문자열도 없는 경우 'a'를 대입한다.

6단계

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

  • 16글자 이상인 경우 15글자까지만 slice한다.
  • slice한 후에 마침표로 끝나면 마지막 마침표를 제거한다.

7단계

new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
return answer.padEnd(3, answer[answer.length-1])

  • 문자열의 길이가 2글자 이하라면, 마지막 문자열을 길이가 3이 될때까지 반복한다. 여기서 padEnd(목표 길이, 추가할 문자열)은 문자열의 끝에 목표 길이가 될때까지 반복한다. padStart는 문자열의 시작에 목표 길이가 될때까지 반복한다.
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글