알고리즘 문제 풀기(프로그래머스)
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이 되도록 반복
}