프로그래머스 신규 아이디 추천 JS 풀이

조병근·2023년 3월 25일
0

알고리즘

목록 보기
3/3
post-thumbnail

프로그래머스 level1 신규아이디추천

Code 1

처리해야할 양이 많다보니 코드가 굉장히 길어질 것이라 생각했다.
그래서 다음과 같이 생각했다.
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문을 생성해 처리를 해주었다. 하지만

Code 2

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;
}

비슷한 듯 다른 코드
과정은 비슷하나 여러 줄을 이용해 적은 것을 깔끔하게 코드를 작성하면 다음과 같이 되는 듯 하다.
코드를 깔끔하게 적는 노력도 필요하다는 생각이 들었다.
이외에도

Code 3

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번 시도 끝에 성공

profile
노력하면 못할 일이 없다

0개의 댓글