문제 및 제한사항
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
**제한사항**
phone_number는 길이 4 이상, 20이하인 문자열입니다.
풀이 방법
예를 들어 주어진 문자열 phone_number가 "01033334444" 일 때 "*******4444"로 반환되면 된다.
해당 문자열의 숫자는 휴대전화번호처럼 344 형태가 아니라 234 형태일 수도 있으므로 앞에서 카운트하기 보다 뒤에서부터 4자리를 카운트했다.
뒤에서부터 4자리 앞은 *이 반복되어 출력되어야 하므로 해당 길이를 leng이라고 선언했다.
그 외 4자리는 문자열을 전개하여 배열로 만든 후, 4자리 시작점부터 4자리를 splice하여 선언했다.
해서 반환 시에는 leng만큼 *를 반복하고, 여기에 4자리(배열 형태)를 joing하여 문자열로 만들어준 후 더해주었다.
지금 쓰다 보니 불필요한 코드가 있어서 정리했다.
매번 티스토리에 풀이를 올리면서 시간 낭비인가 하는 생각이 들 때가 가끔 있는데 이럴 땐 복습하는 게 도움이 되어 다행이다.
다른 분의 풀이도 보았다.
여기서 (?=\d{4})에 괄호가 어떤 의미인지 검색해보니 전방탐색이라고 한다.
전방탐색(lookahead)은 정규식에서 일치를 확인하기 위해 현재 위치에서 앞으로 탐색을 수행하는 것입니다. 이는 실제 매칭 대상에 포함되지 않는 부분으로, 매칭이 되더라도 반환되는 결과에는 포함되지 않습니다.
전방탐색은 (?=pattern) 형태로 사용하며, pattern은 현재 위치에서 탐색할 정규식 패턴을 의미합니다. 예를 들어, /foo(?=bar)/는 foo라는 문자열이 바로 뒤에 bar라는 문자열이 나오는 경우에만 매칭되는 정규식입니다.
전방탐색은 다양한 용도로 활용될 수 있습니다. 예를 들어, /\d+(?= dollars)/는 dollars라는 문자열이 바로 앞에 붙은 숫자들만 매칭시키는 정규식입니다. 이를 이용하면 문자열에서 금액 정보를 추출하는 등의 작업을 수행할 수 있습니다.
그래서 () 형태를 썼던 건데, 숫자 뒤가 4자리인 숫자를 찾아 거기를 *로 대체한다는 뜻이었다!
function hide_numbers(s){
return s.replace(/\d(?=\d{4})/g, "*");
}
이런 풀이도 있었다.
const solution = n => [...n].fill("*",0,n.length-4).join("")
주어진 문자열을 전개하여 배열로 만든 다음, 인덱스 0부터 4자리 앞까지를 *로 채우고 문자열로 만들라는 코드다.
개쩐다.
코드
function solution(phone_number) {
let leng = phone_number.length - 4;
let lastNumber = [...phone_number].splice(leng, 4);
return "*".repeat(leng) + lastNumber.join("");
}
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 제일 작은 수 제거하기 (0) | 2023.04.08 |
---|---|
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 음양 더하기 (0) | 2023.04.08 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 나누어 떨어지는 숫자 배열 (0) | 2023.04.08 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 서울에서 김서방 찾기 (0) | 2023.04.06 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 콜라츠 추측 (0) | 2023.04.06 |