프로그래머스 문제 링크
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;
}