TIL 20221203 - 151번

hoin_lee·2022년 12월 3일
0

TIL

목록 보기
116/236

오늘 공부

알고리즘 문제 풀기(프로그래머스)
https://github.com/hoinlee-moi/Algorithm

JS기본문법 다시 공부
https://github.com/hoinlee-moi/ModernJS

React 강의 듣기
https://github.com/hoinlee-moi/React_prac


오늘 많이 잤고 감기 좋아졌다!
알고리즘을 풀다가 많이 아쉬웠는데 계속 발목을 잡던 정규 표현식에서 문제가 됐다
정규표현식을 날 잡고 한번 조지던가 해야지...

오늘 알고리즘

신규 아이디 추천

function solution(new_id) {
    new_id = alphabetLowerCase(new_id)
    new_id = stringReplace(new_id)
    new_id = continueDotDelete(new_id.split(""))
    if(new_id[0]==="."||new_id[new_id.length-1]===".") new_id=startEndDotDelete(new_id.split(""))
    if(new_id.length>=16) new_id = removeLongText(new_id)  
    if(new_id[0]==="."||new_id[new_id.length-1]===".") new_id=startEndDotDelete(new_id.split(""))
    if(new_id==="") new_id="a"
    if(new_id.length<=2) new_id = recycleText(new_id)
    return new_id
}

const alphabetLowerCase = str =>  str.toLowerCase()
const stringReplace = str=> str.replace(/[^a-z0-9_.-]/g,"")
const continueDotDelete = array=>{
    array.forEach((val,idx,arr)=>{
        if(val==="."&&arr[idx+1]==="."){
            for(let i=idx; i<=arr.length-1;i++){
                if(arr[i]!="."){
                    arr.splice(idx,i-idx-1)
                    break;
                }
                else if(i===arr.length-1){
                    arr.splice(idx,i-idx)
                }
            }
        }
    })
    return array.join("")
}
const startEndDotDelete = array =>{
    if(array.indexOf(".")===0) array[0]=""
    if(array.lastIndexOf(".")===array.length-1) array[array.length-1]=""
    return array.join("")
}
const removeLongText = str =>  str.substring(0,15)
const recycleText = str => {
    while(str.length<3){
        str += str[str.length-1]
    }
    return str
}

각 조건 처리를 전부 함수로 처리하다 보니 생각보다 시간이 많이 투자됐고 길이도 길어졌다.
다만 코드 재활용은 된다는 것인데.. 구현을 할 땐 좋겠지만 알고리즘은 이득인지.. 모르겠다.

정규식을 활용한 풀이!!

function solution(new_id) {
    const answer = new_id
        .toLowerCase() // 1 소문자로 변경
        .replace(/[^\w-_.]/g, '') // 2 특수문자들 제거
        .replace(/\.+/g, '.') // 3 .이 여러개 있으면 . 하나로 변경
        .replace(/^\.|\.$/g, '') // 4 .이 처음이나 끝에 있으면 제거
        .replace(/^$/, 'a') // 5 문자열이 비어있으면 a 넣기
        .slice(0, 15).replace(/\.$/, ''); // 6 15자까지 끊고 다시 맨 앞 맨 뒤에 .이 있으면 제거
    const len = answer.length;
    return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);
  //길이가 2보다 크면 그대로 주고 작으면 마지막 문자를 3이 되도록 반복
}
profile
https://mo-i-programmers.tistory.com/

0개의 댓글