IT 개발자가 되기위한 여정

컴퓨터 공부를 시작함에 앞서 계획 및 개발에 대한 내용을 풀어나갈 생각입니다.

IT 학습/Algorithums

프로그래머스 - 신규 아이디 추천 [정규 표현식 , replace]

제로시엘 2022. 4. 17. 07:37

 

사용한 메소드

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

 

정규표현식

| : 또는() : 그룹 (반복되는 형태) => ( a | b )\[] : 안에 있는 문자 중 하나(?:) : 그룹 없애기ex)/gr\[ab]y/를 통해 gray grby 가능 graby 불가능? : 특정문자가 하나 없거나 있거나\* : 특정문자가 없거나 있거

velog.io