사용한 메소드
replace 정규식
하단부에서 개선된 코드와 활용법에 대해 작성하겠다.
최종적으로 제출한 코드
function solution(new_id) {
var answer = '';
new_id = new_id.toLowerCase();
new_id = new_id.replace(/[^a-z0-9-_.]/g, "");
let id = "";
for(let i = 0 ; i < new_id.length ; i++){
if(new_id[i] === "." && new_id[i] === new_id[i+1]) {
}else{
id += new_id[i];
}
}
new_id = id;
if(new_id[0] === ".") new_id = new_id.slice(1);
if(new_id.length >= 16) new_id = new_id.substr(0,15);
if(new_id[new_id.length - 1] === ".") new_id = new_id.slice(0, -1);
if(new_id.length === 2) new_id = new_id + new_id[1];
if(new_id.length === 1) new_id = new_id + new_id[0] + new_id[0];
if(new_id.length === 0) new_id = "aaa"
return answer = new_id;
}
보면 알겠지만 의식의 흐름대로 작성되어서 아주.. 아주 더럽다.
특히 ".." -> "."으로 변경시에 쓸모없이 for문을 사용하였다.
고려해야 할 점
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이 될 때까지 반복해서 끝에 붙입니다.
기본적으로 먼저 필요없는 문자와 중복된 ".." 문자를 지우고
글짜의 길이에 따라
없음 -> aaa
1문자 (z) -> zzz
2문자 (zc) -> zcc
16문자 이상 -> 뒤를 다 자름 (이경우 마지막 문자를 한번 더 체크해서 .일경우 지우기)
리펙토링
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);
}
해설
.toLowerCase() // 1
로 전체를 소문자로 변경
.replace(/[^\w-_.]/g, '') // 2
최외각 //g는 /(시작) xxxxx (끝)/
[] 는 어느 것이라도 매치된다면 (혹은 내부 전체의 값)
^ 는 역(반전)
\w 는 영어 혹은 숫자 전체
-_. 는 각각의 단어
"" 는 내부의 값을 없는것으로 교체 한다 라는 의미입니다.
.replace(/[\w]/g, '') // 영문자와 숫자가 전부 지워짐
.replace(/[-_.]/g, '') // - _ . 의 문자가 지워짐
.replace(/[\w-_.]/g, '') // 모든 영문자와 숫자 그리고 - _ . 가 지워짐
.replace(/[^\w-_.]/g, '') // 모든 영문자와 숫자 그리고 - _ . 이외의 글자가 사라짐
.replace(/\.+/g, '.') // 3
다른건 중복됨으로 \.+ 이부분만 알아보자면
예를들어 candy , caandy , caaaandy 라는 3개의 단어를
.replace(/\a+/g, 'a') 로 실행한다면 3개의 단어가 전부 candy로 변경됩니다. (a+는 aa aaa aaaa 등을 전부 지정합니다)
즉 . , .. , ... 등을 지정해서 전부 .으로 변경합니다.
.replace(/^\.|\.$/g, '') // 4
여기서 잠깐 생각해야 할 건 대괄호 [] 안에 ^는 안의 형태의 부정(반전) 이지만 대괄호 밖의 ^는 첫번째 글자라는 의미이다 즉
^ -> 1번째 글자
$ -> 마지막 글자
| -> 그리고
1번째 글자 , 마지막 글자를 체크해서 .일경우 삭제한다 라는 의미가 된다.
.replace(/^$/, 'a') // 5
글짜가 없는경우 a로 치환한다.
.slice(0, 15).replace(/\.$/, ''); // 6
0~15글짜 (최대 16) 까지 문자를 자르고 최후미에 "." 이 있는지 체크한다.
const len = answer.length;
return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);
여기서 체크해 둬야 될 건 문자열이 없는경우 5번에서 "a" 라는 new_id로 변경했다는 점을 기억하면 된다.
3문자 이상일 때 = answer 그대로 결과값
2문자 이하일 때 =
없음 -> aaa
1문자 (z) -> zzz
2문자 (zc) -> zcc
를 표현한 메소드 이다.
많이 사용되는 유형 (알고리즘)
1. 단어 문자를 제외한 것 찾기
console.log('!.ar10eispq-_@'.replace(/[\w]/g,''))
//!.-@
2. 단어 문자만 포함하는 것 찾기
console.log('!.ar10eispq-_@'.replace(/[^\w]/g,''))
//ar10eispq_
- \w는 알파벳 + 숫자 + _ 중의 한 문자
3. 단어 문자에 특정 문자(@,!) 포함하는 것만 찾기
console.log('!.ar10eispq-_@'.replace(/[^\w!@]/g,''))
//!ar10eispq_@
4. 연속되는 단어 한개로 바꾸기
console.log('...P...h...'.replace(/\.+/g,'.'))
//.P.h.
5. 처음이나 끝자리 단어가 .이면 제거
console.log('...P...h...'.replace(/^\.|\.$/g,''))
//..P...h..
참고 사이트
https://velog.io/@khw970421/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D
'IT 학습 > Algorithums' 카테고리의 다른 글
[엘리스 SW 3기] 코테전 입,출력 방식 정리 (0) | 2022.08.21 |
---|---|
정규 표현식 활용하기 (데이터 가공) (0) | 2022.06.03 |
프로그래머스 - 숫자 문자열과 영단어 [split , join] (0) | 2022.04.19 |
프로그래머스 - 기능개발 [스택/큐_lv2] (0) | 2022.04.10 |
프로그래머스 - 위장 [해시_lv2] (0) | 2022.04.10 |