본문 바로가기
알고리즘

[프로그래머스][JS] Lv.1 핸드폰 번호 가리기

by codnjs779 2022. 9. 4.

문제 설명

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

제한 조건
  • phone_number는 길이 4 이상, 20이하인 문자열입니다.
입출력 예
"01033334444" "*******4444"
"027778888" "*****8888"

 

 

A. 내가 생각한 풀이 과정

 

1. 입력 문자열 1번째 ~ 끝에서 4번째 자리 전까지 자르기

2. 입력 문자열과 1번에서 자른 문자열 매핑시켜서 해당 문자열을 ' * ' 로 교체

 

이대로 진행 했을 때 문제점?

 

문자열 길이만큼 '*'로 교체되지 않음.

내가 원하는 결과 *******1234 면, 위 방법대로 하면, *1234로 변경됨.

 

A-1. 해결

 

1. 입력 문자열 1번째 ~ 끝에서 4번째 자리 전까지 자르기 (여기까진 같음)

2. 빈 배열 생성

let star = []

3. star 배열에 자른 문자열 길이만큼 '*'를 push 하는 반복문 작성

for(let i = 1; splitNumber.length >= i; i++) {
           star.push('*')
    }

4. start 배열 값 문자열로 변환 

배열을 단순히 문자열로 변환했을 때는 배열 항목별로 ', '로 구분되어 문자열로 변환됨.

🔽

정규식을 이용해서 ', '를 삭제하는 작업 필요 

 

5. 텍스트를 원하는 형태로 가공하기 위해서, 정규식 사용 (' , '  삭제하고 연속된 문자열로 변환)

const solution =  star.toString().replace(/,/g,'')

[정규식 의미]

1) /, => , 로 구분된 문자열

2) /g => 모든 패턴 체크 

3) ,를 어떤 문자열로 변경할 것인지? 여기서 원하는 값은 삭제여서 아무 문자도 넣지 않음

 

6. 출력 값 

answer = phone_number.replace(splitNumber, solution)

replace('교체될 문자열', '교체할 문자열')

 

7. 최종 코드 및 결과 

 

function hide_numbers(phone_number) {
    var answer = ''
    const splitNumber = phone_number.slice(0,-4)
    let star = []
    for(let i = 1; splitNumber.length >= i; i++) {
           star.push('*')
    }
    const solution =  star.toString().replace(/,/g,'')
    answer = phone_number.replace(splitNumber, solution)
    return answer;
}

 

----------

내가 작성한 풀이법은 그렇게 효율적인 방법은 아닌 듯해서 다른 사람 코드를 봤다. 

그중에서 참고하고 기억하고 싶은 풀이 몇 개를 정리하려고 한다. 

----------

🔽

 

A-2 해결 2

 

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

 

[정규식 의미]

1. \d 숫자 전체 

2. 끝에서 4번째까지

3./g 모든 패턴 체크

 

A-3 해결 3 - ✨✨ 쓰고 싶은 코드

 

function hide_numbers(s){
  var result = "*".repeat(s.length - 4) + s.slice(-4);
  return result;
}

[해결 방법]

1. ' * '을 문자열 끝에서 4번째 전까지 반복

2. 문자열을 끝에서 4번째 자리까지 자름

3. 1번 + 2번 합침