본문 바로가기
알고리즘

9. 핸드폰 번호 가리기 (JavaScript)

by 프잘백 2022. 1. 15.
728x90

문제 설명

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

 

 

 

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

 

입출력 예시

 

 

나의 풀이

아마도 실패)

function solution(phone_number) {//예시로 12345
    var a = phone_number/10000;  //a = 1.2345 !!여기서 숫자형으로 변환됨
    var b = a%1*10000;          // b = 0.2345*10000 = 2345
    var x=  (a*10).toFixed();   // x = 문자열 12 (replace를 쓰려면 문자열이어야한다.)
    return x.replace(/[0-9]/g , "*") + Math.round(b) // **2345

}

 

0이 제일 앞에오는 경우만 테스트를 통과한다.

이유는 둘째줄에서 숫자로 변환되며 0이 사라지기 때문!

round로 반올림 한 이유는 a를 1로 나눴을때 나머지가 거지같이 나오기 때문..

(ex 12.345 % 1 하면 12.454999999 이런식인데 왜그런진 모름)

 

 

실패2)

function solution(phone_number) {//예시로 12345
    var a = phone_number/10000;  //a = 1.2345 !!여기서 숫자형으로 변환됨
    var b = a%1*10000;          // b = 0.2345*10000 = 2345
    var x=  (a*10).toFixed();   // x = 문자열 12 (replace를 쓰려면 문자열이어야한다.)
    return phone_number.slice(4).replace(/[0-9]/g , "*") + Math.round(b) // **2345

}

 

0으로 시작하는 숫자도 테스트 통과가 가능하지만 저 반올림 때문에 에러가나는듯 하다..

다 갈아 엎고 조금 더 쉽게 접근해야겠다.

 

성공)

function solution(phone_number) {
    return phone_number.slice(4).replace(/[0-9]/g , "*") + phone_number.substr(phone_number.length-4,4)
    //앞에서부터 (0으로 시작할수도 있기 때문) 4개자르고 별로 변환 + 숫자길이-4 번째 숫자부터 시작하는 4개의 숫자를 들고온다.
    //ex) 01012345678 -> 2345678 -> ******* -> *******5678

 

생각해보니 제한 조건에서 문자열이라고 했기 때문에 굳이 이렇게 했어야했나? 싶다.

+ 이것도 너무 복잡하게 생각한듯??

 

 

모범 답안

 

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

 

정규식 공부 합시다..

 

 

 

정규식


1. 정규표현식 형식

/패턴/플래그

- 슬래시(/) "사이"에는 매칭시킬 "패턴"을 써준다.

- 슬래시(/) "다음"에는 옵션을 설정하는 "플래그"를 써준다.

(플래그는 하나만 찾을지, 모두 다 찾을지 등을 설정하는 옵션이라고 보면 됩니다.)

 

 

2. 정규표현식 매칭 패턴(문자, 숫자, 기호 등)

: 아래 매칭 패턴을 사용하면, 훨씬 쉽게 문자/숫자/기호를 표현할 수 있습니다.

패턴 의미
a-zA-Z 영어알파벳(-으로 범위 지정)
ㄱ-ㅎ가-힣 한글 문자(-으로 범위 지정)
0-9 숫자(-으로 범위 지정)
. 모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두! 단, 줄바꿈X)
\d 숫자
\D 숫자가 아닌 것
\w 영어 알파벳, 숫자, 언더스코어(_)
\W /w 가 아닌 것
\s space 공백
\S space 공백이 아닌 것
\특수기호 특수기호

 

 

3. 정규표현식 검색 패턴

: 아래 패턴들을 이용하면, AND, OR, StartWith, EndWith 등의 다양한 조합을 만들 수 있습니다.

기호 의미
| OR
[] 괄호안의 문자들 중 하나
[^문자] 괄호안의 문자를 제외한 것
^문자열 특정 문자열로 시작(괄호 없음 주의!)
문자열$ 특정 문자열로 끝남
() 그룹 검색 및 분류(match메서드에서 그룹별로 묶어줌)
(?: 패턴) 그룹 검색(분류X)
\b 단어의 처음/끝
\B 단어의 처음/끝이 아님

 

 

4. 정규표현식 갯수(수량) 패턴

: 특정 패턴이 몇번 반복되는지도 필터링 가능합니다.

기호 의미
? 최대 한번(없음 || 한개)
* 없거나 있거나 (없음 || 있음): 여러개 포함
+ 최소 한개(한개 || 여러개)
{n} n개
{Min,} 최소 Min개 이상
{Min, Max} 최소 Min개 이상, 최대 Max개 이하

 

 

5. 정규표현식 플래그

: 플래그는 동시에 여러개 사용할 수도 있습니다. 예) gi, gm 등

플래그 의미
g Global: 모든 문자 검색(안 쓰면 매칭되는 첫 문자만 검색)
i Ignore Case: 대소문자 구분 안함
m Multi line: 여러 행의 문자열에 대해 검색

* 이외에 Singleline, Unicode, Sticky 옵션도 있는데, 잘 쓰진 않는듯 합니다.

 

 

6. 정규표현식 주요 메서드

: 자바스크립트 코드 상에서는 아래 메서드를 통해 패턴을 검사하고, .매칭되는 문자열을 추출, 변환합니다.

메서드 의미
("문자열").match(/정규표현식/플래그) "문자열"에서 "정규표현식"에 매칭되는 항목들을 배열로 반환
("문자열").replace(/정규표현식/, "대체문자열") "정규표현식"에 매칭되는 항목을 "대체문자열"로 변환
("문자열").split(정규표현식) "문자열"을 "정규표현식"에 매칭되는 항목으로 쪼개어 배열로 반환
(정규표현식).test("문자열") "문자열"이 "정규표현식"과 매칭되면 true, 아니면 false반환
(정규표현식).exec("문자열") match메서드와 유사(단, 무조건 첫번째 매칭 결과만 반환)

 

갑자기 많은 양이 나와서 놀라실 수도 있는데, 

실제 사용하는 자바스크립트 코드를 보시면, 훨씬 이해가 쉬우실 겁니다.



출처: https://curryyou.tistory.com/234 [카레유]

댓글