처리해야할 양이 많다보니 코드가 굉장히 길어질 것이라 생각했다.
그래서 다음과 같이 생각했다.
1. 허용되는 문자만 들어있는 문자 배열을 생성
2. new_id를 소문자로 바꾼뒤 허용되는 문자 배열에 포함되지 않은 단어는 공백으로 치환한뒤 후처리
3. . 처리 및 빈 아이디 처리
4. 문자열 길이 처리
function solution(new_id) {
var answer = '';
let allowed=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",".","-","_","0","1","2","3","4","5","6","7","8","9"];
//map과 filter는 array에만 적용되는 듯함
answer=Change(allowed,new_id);
return answer;
}
function Change(allowed,new_id){
//level1
new_id=new_id.toLowerCase();
for(let i=0;i<new_id.length;i++){
if(!allowed.includes(new_id[i])){
new_id=new_id.replaceAll(new_id[i]," ");
}
}
//level2,3
new_id=new_id.replaceAll(" ","");
new_id=new_id.replaceAll(/[.]+/gi,".");
//level4
while(new_id[0]==="."){
new_id=new_id.substring(1);
}
while(new_id[new_id.length-1]==="."){
new_id=new_id.slice(0,-1);
}
//level5
if(new_id.length===0){
new_id+="a";
}
//level6
if(new_id.length>15){
new_id=new_id.substring(0,15);
while(new_id[new_id.length-1]==="."){
new_id=new_id.slice(0,-1);
}
}
//level7
if(new_id.length<=2){
while(new_id.length!==3){
new_id+=new_id[new_id.length-1];
}
}
return new_id;
}
각 레벨별로 if문을 생성해 처리를 해주었다. 하지만
function solution(nid) {
var ans = "";
for (let i = 0; i < nid.length; i++) {
let c = nid[i].toLowerCase();
if ("0123456789abcdefghijklmnopqrstuvwxyz.-_".indexOf(c) === -1) continue;
if (c === "." && ans[ans.length - 1] === "." && nid[i - 1]) continue;
ans += c;
}
if (ans[0] === ".") ans = ans.slice(1);
ans = ans.slice(0, 15);
if (ans[ans.length - 1] === ".") ans = ans.slice(0, ans.length - 1);
if (!ans) ans = "a";
while (ans.length < 3) ans += ans[ans.length - 1];
return ans;
}
비슷한 듯 다른 코드
과정은 비슷하나 여러 줄을 이용해 적은 것을 깔끔하게 코드를 작성하면 다음과 같이 되는 듯 하다.
코드를 깔끔하게 적는 노력도 필요하다는 생각이 들었다.
이외에도
function solution(new_id) {
const answer = new_id
.toLowerCase() // 1
.replace(/[^\w-_.]/g, '') // 2
.replace(/\.+/g, '.') // 3
.replace(/^\.|\.$/g, '') // 4
.replace(/^$/, 'a') // 5
.slice(0, 15).replace(/\.$/, ''); // 6
const len = answer.length;
return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);
}
정규식과 체이닝을 이용한 풀이
정규식은 볼때마다 익숙해지지 않는다는 생각이 들었다.
그래도 코드가 이렇게 깔끔해진다면 익혀야할 것 같다.
8번 시도 끝에 성공