링크 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만으로 한 체이닝으로 끝내버렸다.
간단한 정규식만 사용할 줄 알았는데, 깊게 공부하면 코테에서 좋은 무기가 될 것 같다.