[프로그래머스] 신규 아이디 추천 - 해설

hoonsbory·2022년 12월 28일
0

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

function solution(id) {
    var answer = '';
    const regex = /[a-zA-Z0-9]|-|_|\./
    const removeOtherChar = (id) => [...id].filter(i=>regex.test(i)).join('')
    const twoDotToOneDot = (id) => id.includes("..") ? twoDotToOneDot(id.replace("..",".")) : [...id]
    const popDot = (id) => id[id.length-1]=='.'? id.slice(0,id.length-1) : id;
    const unShiftDot = (id) => id[0]=='.'? id.slice(1) : id;
    const addA = (id) => id.length == 0 ? ["a"] : id;
    const remove15Length = (id) => id.length > 15 ? id.slice(0,15) : id
    const addUnder2Length = (id) => id.length < 3 ? [...id,...(new Array(3-id.length).fill(id[id.length-1]))] : id
    
    const funcArr = [removeOtherChar,twoDotToOneDot,popDot,unShiftDot,addA,remove15Length,popDot,addUnder2Length]
    
    return funcArr.reduce((a,b)=>b(a),id.toLowerCase()).join('')

각 단계별 기능을 수행하는 함수를 만든다.

1단계는 간단해서 생략

2단계 - 소문자,숫자 ,-,.을 제외한 문자 제거 (정규식 사용)

3단계 - ..을 .으로 변경하는 재귀함수

4단계 - 양 옆의 . 제거

5단계 - 빈 문자열이라면 "a" 삽입

6단계 - 16글자 이상이면 15글자 제외 자르기, 그 후 끝에 .은 4단계 함수 사용하여 제거

7단계 - 2글자 이하라면 3 -length로 반복할 숫자를 구하여 fill한 후 기존 배열에 concat

상기 함수들을 리듀스로 실행하여 최종 답 도출

이번 문제로 정규식의 위대함을 뼈저리게 느꼈다.

고수들의 풀이를 보면 정규식과 replace만으로 한 체이닝으로 끝내버렸다.

간단한 정규식만 사용할 줄 알았는데, 깊게 공부하면 코테에서 좋은 무기가 될 것 같다.

0개의 댓글