[코테] 핸드폰 번호 가리기, 문자열 일부 가리기

JulyK9·2022년 12월 21일
0

문제

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

제출 코드

function solution(phone_number) {
    // 보존할 마지막 4자리 숫자
    let last4Digit = phone_number.slice(-4)
    // 바꿔줘야할 문자의 길이
    let replaceLength = phone_number.length - 4
    // 새로운 조합으로 문자 생성
    return "*".repeat(replaceLength) + last4Digit
}

접근 과정

  • 처음에는 str.replace()를 써보려했지만 바꿔줄 수를 인자에 명시할 수 없을 것 같아서 새로운 string 조합으로 결과를 도출해보기로 함
  • slice 메서드로 보존해야할 부분을 변수에 담아줘서 분리
  • 얼만큼을 "*"로 바꿔줄 것인가는 총 문자 길이에서 유지할 문자 길이를 제외하여 특정함
  • "*"(문자열)을 어떻게 반복 생성할지 고민하다가 검색을 통해 str.repeat() 메서드를 활용할 수 있었음

다른 풀이 1.

function hide_numbers(s) {
  return s.replace(/\d(?=\d{4})/g, "*");
}
  • 정규식을 활용
    정규식은 보통 /abc/와 같은 형식을 사용하며, 두개의 슬래쉬 문자/ 사이에 정규식을 작성. 두번째 슬래쉬 뒤에 플래그를 사용할 수 있음.
    g(global) 문자열에서 첫번째 매칭 후, 끝나지 않고 매칭되는 모든 항목을 찾습니다
    \d: 숫자 하나와 매칭
    abc{2}: ab 그리고 2개의 c 를 포함한 문자열과 매칭
    d(?=r): r이 바로 뒤에 있는 d를 매칭. r은 포함되지 않음
    => \d(?=\d{4}) : 4개의 숫자가 바로 뒤에 오는 숫자를 찾아
    => /\d(?=\d{4})/g : 그걸 global로 계속 찾아
    => 결과 참고 : https://regex101.com/r/cO8lqs/4

=> 내가 replace를 활용하지 못한 이유가 있는 듯.. 정규표현식 정리를 꼭 한번 해야할 것 같다

  • str.replace() 메서드 활용

다른 풀이 2.

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

  return result;
}
  • 같은 방법인데 변수에 할당을 더 적게 함
    => 그러면 메모리를 더 적게 쓰는 걸까?
  • 그런 방향이라면 result 변수도 필요없이 바로 return 할 수 있을 것 같다.

다른 풀이 3.

const solution = n => [...n].fill("*",0,n.length-4).join("")
  • string을 배열 안에서 스프레드 연산자로 풀어줘서 각 자리수를 요소로 하는 배열을 만들어 줌
  • Array.fill() 메서드가 value, start, end의 3개 인자를 가지고 기존 배열의 요소를 채워주는 것을 활용
  • 즉 0부터 마지막 4자리 전까지는 value로 채워줌
  • arr.join() 메서드로 배열의 요소를 문자열로 합쳐줌

참고자료

profile
느리지만 꾸준하게. 부족하거나 잘못된 부분은 알려주시면 감사하겠습니다.

0개의 댓글