문제
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수를 만드는 문제
제출 코드
function solution(phone_number) {
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를 활용하지 못한 이유가 있는 듯.. 정규표현식 정리를 꼭 한번 해야할 것 같다
다른 풀이 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() 메서드로 배열의 요소를 문자열로 합쳐줌
참고자료