본문 바로가기
알고리즘 문제/프로그래머스_Lv1 도장깨기

[프로그래머스] 신규 아이디 추천 (Javascript)

by 스코필 2024. 12. 23.

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

신규 유저가 입력한 아이디가 new_id라고 한다면, 다음 규칙에 따라 변경이 됩니다.

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이 될 때까지 반복해서 끝에 붙입니다.

 

제한 사항

  • new_id는 길이 1 이상 1,000 이하인 문자열입니다.
  • new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
  • new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.

 

✅ Code - 성공

function solution(new_id) {
    var answer = '';
    
    // 1단계
    new_id = new_id.toLowerCase();
    
    // 2단계
    const pos_str = /[a-z0-9-_.]/;
    for (let str of new_id) {
        if (pos_str.test(str)) answer += str;
    
    
    // 3단계
    let idx = 0
    while (idx < answer.length - 1) {
        if (answer[idx] === '.' && answer[idx + 1] === '.') answer = answer.slice(0, idx) + answer.slice(idx + 1);
        else idx ++;
    }
    
    // 4단계
    if (answer[0] === '.') answer = answer.slice(1);
    if (answer[answer.length - 1] === '.') answer = answer.slice(0, answer.length - 1);
    
    // 5단계
    if (!answer) answer += 'a';
    
    // 6단계
    if (answer.length >= 16) {
        answer = answer.slice(0, 15);
        if (answer[answer.length - 1] === '.') answer = answer.slice(0, answer.length - 1);
    }
    
    // 7단계
    while (answer.length <= 2) answer += answer[answer.length - 1];
    
    return answer;
}

 

※ 참고 (정규표현식을 이용한 풀이)

function solution(new_id) {
    var answer = ''
    answer = new_id.toLowerCase() // 1단계
    
        .replace(/[^a-z0-9-_.]/g, '') // 2단계
        /*
            [^...] - [^] : 대괄호 안에서 ^을 쓰면 제외의 뜻, ex) [^a-z] : 소문자 알파벳을 제외한 모든 문자
                   - 대괄호 안에서 -_. 같은 특수문자는 문자 그대로 해석     
            a-z : 소문자 알파벳 (a부터 z까지)
            0-9 : 숫자(0부터 9까지)
            g : 모든 검색 결과를 반환        
        */
    
        .replace(/\.+/g, '.') // 3단계
        /*
            \ = 문자 그대로 해석 ex) \. : 마침표(.) 그대로 해석
            + = 바로 앞에 요소가 1번 이상 반복
        */
        .replace(/^\.|\.$/g, '') // 4단계
        /*
            ^ : 문자열의 시작
            $ : 문자열의 끝
            | : or 연산
        */
        .replace(/^$/, 'a') // 5단계
        .slice(0, 15).replace(/\.$/, ''); // 6단계
    
    while (answer.length <= 2) answer += answer[answer.length - 1]; // 7단계
    
    return answer
}