알고리즘 문제풀이/프로그래머스

신규 아이디 추천 / js 풀이

Heman 2021. 6. 23. 20:30

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

https://programmers.co.kr/learn/courses/30/lessons/72410

문제풀이

이번 문제는 카카오 블라인드 채용의 코딩 테스트에서 출제되었던 문제입니다.

풀이는 문제에 제시한 대로 각 단계를 구현하면 되지만, 푸는 방식이 사람마다 다르기 때문에 가지각색의 풀이가 보입니다.

 

제 풀이는 그다지 좋은 풀이는 아닌것 같네요.. ㅜㅜ 정규식을 아직 제대로 활용하지 못하기 때문에 풀이를 단순 무식하게 푼 것 같습니다.

if문에 들어간 level은 단순히 단계를 구분하기 위해 사용한 것으로, 제거하여도 문제는 통과합니다.

 

  1. new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
  2. new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
  3. new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
  4. new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
  5. new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
  6. new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
  7. new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

 

코드

function solution(new_id) {
    let tmp = new_id.toLowerCase();	// 1단계
    let level = 2;
    let result = "";
    
    const filterEng = /[a-z]/;
    const filterSpec = /[-_.]/;
    const filterNum = /[0-9]/;
    
    if(level === 2){ // 2단계
        for(let i=0; i<tmp.length; i++)
            if(filterEng.test(tmp[i]) || filterSpec.test(tmp[i]) || filterNum.test(tmp[i]))
                result += tmp[i];
        level ++;
        tmp = "";
    }
    
    if(level === 3){ // 3단계
        let dot = "";
        
        for(let i=0; i<result.length; i++){
            if(result[i] === ".") dot = ".";
            else{
                if(dot === "."){
                    tmp += dot + result[i];
                    dot = "";
                }
                else tmp += result[i];
            }
        }
        level ++;
        result = "";
    }
    
    if(level === 4){ // 4단계
        if(tmp[0] === ".") result = tmp.substr(1,tmp.length-1);
        else if(tmp[tmp.length]-1 === ".") result = tmp.substr(0, tmp[tmp.length]-2);
        else result = tmp;
        
        level ++;
        tmp = "";
    }
    
    if(level === 5){ // 5단계
        if(result === "") result = "aaa";
        level ++;
    }
    
    if(level === 6){ // 6단계
        if(result.length >= 16 ){
            if(result[14] === ".") tmp = result.substr(0,14);
            else tmp = result.substr(0,15);        
        }
        else tmp = result;
        level ++;
    }
    
    if(level === 7){ // 7단계
        if(tmp.length <= 2)
            while(result.length < 3)
                result += tmp[tmp.length-1];
        else result = tmp;
    }
    
    return result;
}

 

 

리뷰

실제 개발에서는 문자열을 다루는 일이 많은데요. 제 풀이는 단순 무식하게 푼 문제라 통과는 했지만 조금 아쉬운 부분이 있었습니다.

다른 정답자 분들의 풀이 중에는 정규식과 체이닝만을 이용해 정말 간단히 푼 방식도 많았는데요. 정규식도 정말 다양하게 사용될 수 있다는 걸 알게 된 것 같습니다..