Programming

[알고리즘] 프로그래머스 신규 아이디 추천

jay-dev 2023. 6. 26. 19:12

프로그래머스 문제 링크

My Solution / Try

  • 지금까지 공부한 반복문, 조건문을 복습하기 위해 정규표현식을 사용하지 않은 풀이 (정규표현식을 이용한 풀이는 아래 Advanced Solution)
  • 조건2(사용불가능한 특수문자를 전부 제거하기)와 조건3(2번 이상 연속된 마침표를 하나로 치환)이 특히 까다로웠음
  • '사용불가능한 특수문자 제거'는 filter와 includes를 사용,
    문자열에 사용불가능한 특수문자의 요소가 존재하지 않는 것들만 필터링
  • '2번 이상 연속된 마침표 하나로 치환'은 반복문을 사용(stack의 개념 차용)
    직전 인덱스와 비교해서 중복되지 않는 경우에만 추가
function solution(조건) {
    
    let 특수문자 = "-_.~!@#$%^&*()=+[{]}:?,<>/"
    let 가특 = 특수문자.substr(0,3)
    let 불가특 = 특수문자.substr(3)
  
    let 조건1 = 조건.toLowerCase()   
   
    let 조건2 = 조건1.split("").filter(e => !불가특.includes(e)).join("")
    
    let 조건3 = ""
    for (let i = 0; i < 조건2.length; i++) {
        if (조건2[i-1] === "." && 조건2[i-1]===조건2[i]) {
            조건3.substr(0, 조건3.length-1)
            continue;
        } else {
            조건3 += 조건2[i]
        }
    } 
       
    let 조건4 = ""
    if (조건3[0] === ".") {
        조건4 = 조건3.substr(1)
    } else if (조건3[조건3.length-1] === ".") {
        조건4 = 조건3.substr(0,조건3.length-1)        
    } else {
        조건4 = 조건3
    }
   
    let 조건5 =""
    조건4.length === 0 ? 조건5 = "a" : 조건5 = 조건4  
    
    let 조건6 = ""
    조건5.length >= 16 ? 조건6 = 조건5.slice(0,15) : 조건6 = 조건5
    if (조건6.at(-1) === ".") {
        조건6 = 조건6.slice(0,-1)
    }
    
    let 조건7 = ""    
    조건6.length <= 2 ? 조건7 = 조건6 + 조건6[조건6.length - 1].repeat(3 - 조건6.length) : 조건7 = 조건6 
  
    return 조건7    
}

Advanced Solution

function solution(s) {
  
  s = s.toLowerCase()
   		.replace(/[^\w\-\.]/g, "")  
 		.replace(/\.{2,}/g, ".") 
  		.replace(/^\.|\.$/, "")

  s.length === 0 ? s = "a" : s = s
  s.length >= 16 ? s = s.slice(0, 15) : s = s  
  
  s = s.replace(/\.$/, "")
 
  s.length <= 2 ? s = s + s[s.length - 1].repeat(3 - s.length) : s = s  

  return s;
}