js regex, 신규 아이디 추천

이종호·2021년 4월 4일
0

알고리즘

목록 보기
6/10
post-thumbnail

문제

대략 소문자, 숫자, -, _, .이고 3 <= length <= 15이며, 앞과 뒤에 .은 들어올 수 없다는 규칙이다.

대략 regex를 쓰면 편하겠다 생각하고 예전에 잠깐 스쳐지나간 엘리님의 추천사이트를 이용해 어찌저찌 만들어 갔다.

첫 풀이다.

function solution(new_id) {
  var answer = '';
  
  answer = new_id.toLowerCase();
  
  let regex = /[^(\d|\w|\.|\-|\_)]/g;
  answer = answer.replace(regex, '');
  
  regex = /\.{2,}/g;
  answer = answer.replace(regex, '.');
  
  if(answer[0] == '.'){
      answer = answer.slice(1);
  }
  if(answer[answer.length-1] == '.'){
      answer = answer.slice(0, answer.length-1);
  }
  if(answer.length === 0){
    return 'aaa';
  }
  if(answer.length > 15){
    answer = answer.slice(0, 15);
    if(answer[answer.length-1] == '.'){
      answer = answer.slice(0, answer.length-1);
    }
  }
  while(answer.length < 3){
    answer = answer + answer[answer.length-1];
  }
  
  return answer;
}

알게된 점

  1. 체이닝을 활용할 수 있는데 사용하지 않았다.

  2. ()는 제거하지 못한다.

  3. g옵션을 이용하면 replaceAll과 같은 효과를 낸다.(replaceAll은 최신 브라우저에서만 적용되는 메서드라 프로그래머스사이트에선 적용되지 않는다.)

2번 문제는 ()는 당연히 묶는 연산이라 생각한 나의 잘못이다.
/[^\d|\w|\.|\-|\_]/g이렇게 하니 잘 되었다.

다른사람 풀이를 보니 체이닝을 굉장히 잘 이용한 유저가 1등을 먹고있었다.
대충 할 수 있다는 사실만 캐치하고 최대한 혼자해보려했다.

1번은 최대한 혼자 해보려했지만, 맨 끝과 맨 처음의 .을 구하는 부분과
빈 문자열을 찾는 부분을 보고말았다.

줄인 코드

function solution(new_id) {
  var answer = new_id.toLowerCase()
  .replace(/[^\w|\.|\-]/g, '')
  .replace(/\.{2,}/g, '.')  // .이 두개 이상
  .replace(/^\.|\.$/g, '') // 처음과 끝에 .
  .replace(/^$/, 'a')      // 빈 문자열..!
  .slice(0, 15).replace(/\.$/, '');
  const len = answer.length;
  
  return len > 2? answer:answer+answer.charAt(len-1).repeat(3-len);
}

느낀 점

regex를 활용해볼 기회를 줘서 너무 좋았다.
항상 느끼는 거지만 kakao는 문제도 뭔가 실제로 쓰일만한 부분을 내는 것 같아 좋다.

앞으로도 문자열 검사는 왠만하면 regex를 이용해 더 익숙해지면 좋겠다.

참고한 사이트

https://regexr.com/
https://github.com/dream-ellie/regex

profile
코딩은 해봐야 아는 것

0개의 댓글