본문 바로가기
Algorithm

[프로그래머스] 핸드폰 번호 가리기 | JavaScript

by Vintz 2021. 6. 10.
반응형

핸드폰 번호 가리기

문제 설명

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.

전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건

  • s는 길이 4 이상, 20이하인 문자열입니다.

입출력 예

phone_number return
"01033334444" "*******4444"
"027778888" "*****8888"

정규 표현식을 사용하자

문제를 읽고 바로 정규 표현식이 생각이 났다. 문제 설명에서 나온 '뒷 4자리를 제외한 나머지'를 찾아 *로 replace하면 되는 것이었다. 하지만 막상 정규 표현식으로 찾으려고 하니 답이 잘 나오지 않았고 고민 끝에 조금 수고스러운(?) 코드지만 테스트는 통과하게 되었다.

코드

function solution(phone_number) {
  const len = phone_number.length - 4;

  for (let i = 0; i < len; i++) {
    phone_number = phone_number.replace(/\d/, '*');
  }

  return phone_number;
}

테스트를 통과한 후 분명 정규 표현식을 사용해서 푼 사람이 있을 것을 예상하고 다른 사람의 문제 풀이를 보았는데 역시나..!

문제 풀이가 존재했고 정규 표현식에 대해 좀 더 알게 되었다.

나같은 경우 뒷 4자리는 지정할 수 있었지만 뒷 4자리만 빼고 나머지를 지정하는 것에 어려움을 겪었는데 해당 문제는 전방탐색이라는 표현식을 통해 해결할 수 있다. 

전방탐색(lookahead)패턴은 일치 영역을 발견해도 그 값을 반환하지 않는 패턴을 말합니다.  ﹒﹒﹒
전방탐색 패턴의 구문은 ?=로 시작하고 등호(=) 다음에 오는 문자가 일치하는 영역에서 제외됩니다.
- http://minsone.github.io/regex/regexp-lookaround

전방탐색 표현식을 통해 패턴을 그룹화(4개의 숫자)해서 반환하지 않게 하고 그 앞의 나머지 숫자들을 지정 해주면 된다. 다시 말해 그룹화를 제외한(?=\d{4}) 앞의 패턴을 모두 지정하게 하면 된다.

function solution(phone_number) {
    // 4개의 숫자를 제외한(?=\d{4}) 전방의 숫자들 탐색 \d
    return phone_number.replace(/\d(?=\d{4})/g, "*");
}

 

반응형