본문 바로가기
Developer/Algorithm

Programmers 프로그래머스 코딩테스트 연습 - 핸드폰 번호 가리기 (JavaScript)

by roqkfrlfhr 2020. 9. 4.

Programmers 프로그래머스 코딩테스트 연습 - 핸드폰 번호 가리기 (JavaScript)

 

Programmers의 코딩테스트 연습문제 Level 1의 핸드폰 번호 가리기 문제를 JavaScript를 사용하여 문제를 풀어보도록 하겠습니다.

 

문제 설명

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

 

제한 조건

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

 

입출력 예

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

 

 

작성한 답

solution.js

function solution(phone_number) {
    return phone_number.replace(/\d(?=\d{4})/g, "*");
}

 

설명

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

이러한 문자열 처리하는 문제는 언제나 그렇듯 정규표현식을 먼저 떠올리고 정규표현식으로 해결하는 것이 가장 깔끔하게 문제를 해결할 수 있습니다.

전화번호 문자열이 담긴 phone_number을 정규식을 사용해 마지막 숫자 4자리를 제외한 모든 숫자를 매칭시켜 '*' 문자로 바꿔주면 문제를 아주 쉽게 해결할 수 있습니다.

마지막 숫자 4자리를 제외한 모든 숫자를 매칭시키는 정규식은 /\d(?=\d{4})/g 입니다.

위 정규식을 간단하게 설명드리도록 하겠습니다.

 

먼저 정규식은 두개의 / 사이에 작성합니다.

\d 숫자를 의미합니다. [0-9]와 같은 의미입니다.

그리고 숫자를 의미하는 \d 뒤에 () 소괄호를 사용하여 하위식으로 패턴을 지정해줄겁니다.

소괄호 안에 전방탐색을 의미하는  ?= 을 사용하고 그 뒤에 숫자 4자리를 의미하는 \d{4} 를 붙여

결국 (?=\d{4}) 로 숫자 네자리로 끝나는 문자열의 앞부분들을 의미합니다.

결국 /\d(?=\d{4})/ 는 숫자 네자리로 끝나는 문자열의 앞의 숫자들을 의미하며,

이대로만 작성해도 되겠다 하실 수 있지만 마지막 / 뒤에 발생할 모든 패턴에 대한 전체 검색을 뜻하는 플래그 g를 붙여줘야합니다.

왜냐하면, 플래그 g를 붙여주지 않고 /\d(?=\d{4})/ 로만 replace를 하게 되면,

입출력 예의 "01033334444" 로 예를 들었을때, *1033334444" 라는 값을 return 합니다.

그 이유는 맨 앞의 "0"만 봐도 "1033"이라는 4개의 숫자 앞에 있는 숫자 이기 때문이죠,

그래서 "0", "01", "010", "0103", "01033", "010333", "0103333" 의 모든 패턴이 매칭될 수 있도록 플래그 g를 붙여

/\d(?=\d{4})/g 로 사용해 주셔야 합니다. 아래의 제가 쓴 글을 참고해주시면 좋을 것 같습니다.

 

JavaScript replace, replaceAll (문자열 전체 변경) 정말 간단

JavaScript replace, replaceAll (문자열 전체 변경) JavaScript에서는 replaceAll 이라는 함수가 존재하지 않습니다. 하지만 많은 분들이 replaceAll 즉 하나가 아닌 여러개의 문자열을 변경하는 방법을 찾..

jsikim1.tistory.com

그리고 매칭되는 패턴을 replace() 함수로 "*"을 변경해주시면 됩니다.

 

 

제가 틀린 부분이 있다거나 더 좋은 방법을 아시는 분이 계시다면 댓글로 공유 부탁드립니다!

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청 사항은 언제든지 말씀 해주세요!

 

감사합니다.


댓글