프로그래머스 : 신규 아이디 추천 (level 1)

김진권·2021년 7월 26일

algorithm

목록 보기
3/10

<문제>


1. 나의 풀이

function solution(new_id) {
    let answer = '';
    // 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
    new_id = new_id.toLowerCase();

    // 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
    const posssibleAlphabet = ['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'];
    const possibleNumber = ['1','2','3','4','5','6','7','8','9','0'];
    const possibleSpecial = ['-','_','.'];

    let new_id_arr = new_id.split('');
    new_id_arr = new_id_arr.filter(function(element) {
        return posssibleAlphabet.includes(element) || possibleNumber.includes(element) || possibleSpecial.includes(element);
    })

    // 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
    const new_id_arr2 = [];
    for(let i = 0; i<new_id_arr.length; i++) {
        if (new_id_arr[i] === new_id_arr[i+1] && new_id_arr[i+1] === '.') ;
        else new_id_arr2.push(new_id_arr[i]);
    }

    // 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
    if(new_id_arr2[0] === '.') new_id_arr2.shift();
    if(new_id_arr2[new_id_arr2.length-1] === '.') new_id_arr2.pop();

    // 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
    if(new_id_arr2.length === 0) new_id_arr2[0] = 'a';

    // 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
    // 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
    if(new_id_arr2.length >= 16) new_id_arr2.length = 15;
    if(new_id_arr2[new_id_arr2.length-1] === '.') new_id_arr2.pop();

    // 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
    if(new_id_arr2.length <= 2) {
        while (new_id_arr2.length < 3) {
            new_id_arr2.push(new_id_arr2[new_id_arr2.length-1]);
        }
    }
    answer = new_id_arr2.join('');
    return answer;
}

✳️ 풀이 과정 :

1️⃣ 특별할 것이 없다.. 그저 문제에서 시키는대로 작성함.


고수의 풀이

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

✳️ 풀이 과정 :
정규표현식을 사용하였다.

1️⃣ new_id의 모든 대문자를 대응되는 소문자로 치환합니다.

.toLowerCase() // 1

➡️ new_id 의 문자열을 소문자로 변경.

2️⃣ newid에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(), 마침표(.)를 제외한 모든 문자를 제거합니다.

.replace(/[^\w-_.]/g, '') // 2

➡️ 숫자나 문자, -, , ., (\w-.) 가 아닌 (^) 문자열을 전체 (g) 에서 검색 후 빈문자열('')로 대체한다.

3️⃣ new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.

.replace(/\.+/g, '.') // 3

➡️ 정규표현식에서 .은 개행문자를 제외한 모든 단일문자가 될 수 있기 때문에
\ (백슬래시) 를 붙여서 문자그대로 해석되게 한다.
정규표현식 / \ .+/g는 . .. ... 등 .이 한번 이상 반복되는 모든 문자열을 검색한다. 검색한 문자열을 .으로 대체한다.

4️⃣ new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.

.replace(/^\.|\.$/g, '') // 4

➡️ .으로 시작하거나 (^ \ .) .으로 끝나는 (\ .$) 모든 (g) 문자열을 검색 후 제거한다.('')

5️⃣ new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.

.replace(/^$/, 'a') // 5

➡️ 빈문자열을 검색한다 (/^$/) 'a' 로 대체.

6️⃣
1. new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
2. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.

.slice(0, 15).replace(/\.$/, ''); // 6

✳️ 고수의 풀이를 보면서 정규표현식을 공부할 수 있었음. 😅


출처 : https://programmers.co.kr/learn/courses/30/lessons/72410
정규표현식
DEVHolic :: 정규표현식에 쓰이는 특수문자
정규표현식 (Regex) 정리

profile
start!

0개의 댓글