



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) 정리