PR - 신규 아이디 추천[실패]

Goody·2021년 3월 16일
0

알고리즘

목록 보기
70/122

문제

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


예시

nonew-idresult
예1"...!@BaT#*..y.abcdefghijklm""bat.y.abcdefghi"
예1"z-+.^.""z--"
예1"=.=""aaa"
예1"123_.def""123_.def"
예1"abcdefghijklmn.p""abcdefghijklmn"

풀이

  • 주어진 문자열을 배열화한다음, 각 단계별로 처리한다.
  • 1단계 : 정규표현식을 이용, 배열을 매핑하여 정규표현식에 match 되는 원소는 소문자로 변환한다.
  • 2단계 : 정규표현식을 이용, 배열을 필터링하여 정규표현식에 match 되는 원소만 걸러낸다.
  • 3단계 : 따로 변수를 선언하여 . 이 2개 이상 연속되는 경우 변수의 값을 1 증가시킨다. .의 연속이 끝나는 경우 선언한 변수만큼 배열을 splice로 잘라낸다.
  • 4단계 : shift 혹은 pop을 이용하여 배열의 양 끝이 . 일 경우 배열의 양 끝을 자른다.
  • 5단계 : 배열의 길이가 0인 경우 배열에 'a' 를 push 한다.
  • 6단계 : 배열의 길이가 15보다 클 경우, slice로 배열을 잘라낸다. 이 때 배열의 맨 마지막 원소가 . 이면 잘라낸다.
  • 7단계 : 배열의 길이가 2보다 작으면, 배열의 길이가 3이 될 때 까지 배열에 배열의 마지막원소를 push로 계속 밀어 넣는다.
  • 배열을 다시 join 으로 문자화한다.

코드

function solution(new_id) {
    let answer = "";
    let arr = Array.from(new_id);

    // 1단계
    let regex = /[A-Z]/
    arr = arr.map((el) => {
        if (el.match(regex)) return el.toLowerCase();
        else return el;
    })

    // 2단계
    regex = /[a-z]|[0-9]|[-_.]/
    arr = arr.filter((el) => {
        return (el.match(regex))
    })

    // 3단계
    let dotSequence = 0;
    arr.forEach((el, idx, ar) => {
        if (el === '.' && el === ar[idx + 1]) dotSequence++;
        else {
            ar.splice(idx - dotSequence, dotSequence);
            dotSequence = 0;
        }
    });

    // 4단계
    if(arr[0] === '.') arr.shift(); 
    if(arr[arr.length-1] === '.') arr.pop();

    // 5단계
    if(arr.length === 0) arr.push('a');

    // 6단계
    if(arr.length > 15) arr = arr.slice(0,15);
    if(arr[arr.length-1] === '.') arr.pop();


    // 7단계
    if(arr.length <= 2) {
        while(arr.length !== 3) {
            arr.push(arr[arr.length-1]);
        }
    }

    answer = arr.join("");

    return answer;
}

0개의 댓글