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

해피데빙·2022년 6월 22일
0

코딩테스트

목록 보기
17/52
post-custom-banner

문제

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

다른 사람 풀이

function solution(new_id) {
  let answer = new_id
    .toLowerCase() //step 1
    .replace(/[^0-9a-z._-]/g, "") 
    // step 2  : ^를 []안에 넣으면 아닌 것들 replace
    .replace(/\.+/g, ".") 
    //step 3 : .이 연속인 것들 
    .replace(/^\.|\.$/g, "") 
    //step 4 : ^이 처음
    .replace(/^$/, "a") //step 5
    .slice(0, 15)
    .replace(/\.$/, ""); //step 6
  // step7
  if (answer.length === 1) answer = answer[0].repeat(3);
  if (answer.length === 2) answer = answer + answer[1];

  return answer;
}

내 풀이

문제 : 시간 초과

function solution(new_id) {
 
    //1단계
    let answer = new_id.toLowerCase()
    
    //2단계
    var regEmail = /^[a-z0-9-_.]$/;
    answer = answer.split('').filter(el => regEmail.test(el)).join('')
  
    //3단계
    answer = answer.replace(/\.\./gi, '.')
     
    //4단계
    if(answer==='.'){ 
        answer=''
    }else{
           for(let i=0; i<answer.length; i++){ 
       if(answer[i]!=='.'){
           answer = answer.slice(i)
           break;
       }
   }
  
    for(let i=answer.length-1; i>=0; i--){ 
        if(answer[i]!=='.'){ 
        answer = answer.slice(0, i+1)
        break;
        }
    }
        
    }
 
    //5단계
    if(answer.length === 0)answer='a'; 
    
    //6단계
    if(answer.length >=16)answer = answer.slice(0,15)
    if(answer[answer.length-1]==='.')answer = answer.slice(0, answer.length-1)
 
    if(answer.length<=2){ 
        while(answer.length<3){ 
            answer += answer[answer.length-1]
        }
    }

 
    return answer;
}

정규표현식

  • \d : 숫자를 찾아내는

  • \w : 글자를 대표하는 정규표현식입니다.
    ex. a, b, c, 가, 나, 다, 1, 2와 같은 문자와 숫자를 포함합니다.
    특수문자는 포함하지 않지만, _(언더스코어)는 포함합니다.

  • +: 하나 혹은 그 이상 연결된
    ex. \d+ : 전화번호를 구성하는 043이나 2568같이 연결된 숫자

  • '*' : 0개 이상

  • []: 안에 있는 것들을 옵션으로 준다
    ex. \d는 "숫자가 0개 이상이다"를 의미합니다.
    이를 이용하면 자연수는 [1-9]\d
    로 표현할 수 있습니다.

  • ?: '있거나 없거나'라는 뜻입니다.
    ex. -?: "-가 있거나 없다"
    따라서 이를 연속하는 숫자는 \d+와 조합하면 전화번호를 찾는 정규표현식을 만들 수 있습니다.

\d+-?\d+-?\d+

-또는 (공백)이 있거나 없다는 조건은 [- ]?로 표현할 수 있습니다.

\d+[- ]?\d+[- ]?\d+
  • {숫자}: "숫자번 반복한다"는 뜻입니다.
    ex. \d{2}는 "숫자가 연속 두 번 나온다"는 뜻입니다

  • {숫자1, 숫자2}: "숫자1부터 숫자2까지 반복한다"는 뜻입니다.
    ex. \w{2,3}는 "문자가 2 ~ 3번(개수) 나온다"는 뜻입니다.

  • 알파벳 중에 소문자 모음(a,e,i,o,u)만 고르고 싶을 때
    : [aeiou]

  • [a-z]는 "a부터 z까지 글자를 모두 선택하라"는 의미입니다.

  • 연속된 영어 소문자: [a-z]+

  • 연속된 한글 : [가-힣]+

  • \s 공백 문자(스페이스, 탭, 뉴라인)

  • \S 공백 문자를 제외한 문자

  • \D 숫자를 제외한 문자

  • \W 글자 대표 문자를 제외한 글자들(특수문자, 공백 등)

자바스크립트는 match라는 함수를 쓴다
문자열.match(/정규표현식/g)를 쓰면 일치하는 모든 내용을 찾아올 수 있다
g는 global의 약자로, 정규표현식과 일치하는 모든 내용을 찾아오라는 옵션입니다.

var regex = /\d/g
console.log(searchTarget.match(regex));
  • ^: 문자열의 처음
  • [^2-8] : []안에 들어오는 범위의 문자가 아닌 것들
  • $: 문자열의 마지막

/[^0-9a-z._-]/g : 0~9, a~z, ., _, - 가 아닌 것들 모두
/\.+/g : .이 연속으로 있는 것들 모두
/^\.|\.$/g : 시작에 .이 있거나 끝에 .이 있을 때
정규표현식 : // + ^(시작) + .(내용) + |(또는) + .(내용)$(끝)

/^$/ : ''
빈문자열일 때만 의미함

/.$/ : 문장 마지막에 있는 .

정규표현식의 구조

ex. 전화번호
1. 데이터의 시작점(^)
2. 비캡처 그룹((?:))으로

  • 1의 뒤를 잇는 세 개의 숫자(\d{3})
  • 또는(|)
  • 여는 괄호(()뒤 세 개의 숫자(\d{3})의 뒤를 잇는 닫는 괄호())
  1. 캡처 그룹(())으로
  • 2의 뒤를 잇는 하나의 대시, 슬래시, 또는 마침표
  1. 3의 뒤를 잇는 네 개의 숫자(\d{4})
  2. 4의 뒤를 잇는, 첫 번째 캡처 그룹에서 기억한 부분 문자열(\1)
  3. 5의 뒤를 잇는 네 개의 숫자(\d{4})
  4. 데이터의 끝점($)

repeat

repeat() 메서드는 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환합니다.

profile
노션 : https://garrulous-gander-3f2.notion.site/c488d337791c4c4cb6d93cb9fcc26f17
post-custom-banner

0개의 댓글