
개인정보 문자열 s가 주어진다. 이메일이거나 전화번호이며, 아래 규칙으로 마스킹한 결과를 반환한다.
이메일
@ 앞)는 첫 글자와 마지막 글자만 남기고 그 사이를 *****(5개)로 바꾼다.전화번호
*로 마스킹한다.+ 뒤에 자릿수만큼 *를 붙여 맨 앞에 둔다.| 숫자 자릿수 | 국가 코드 | 출력 형식 |
|---|---|---|
| 10 | 없음 | ***-***-1111 |
| 11 | 1자리 | +*-***-***-1111 |
| 12 | 2자리 | +**-***-***-1111 |
| 13 | 3자리 | +***-***-***-1111 |
분기는 @ 포함 여부 하나면 충분하다.
@로 나누고 소문자화한 뒤, 로컬 파트의 첫 글자 + ***** + 마지막 글자를 조합한다.slice(-10)으로 지역 번호를 떼고, 남는 길이가 국가 코드 자릿수다. 블록을 배열로 만들고 -로 합친다.function maskPII(s: string): string {
if (s.includes('@')) {
const [name, domain] = s.split('@').map((str) => str.toLowerCase());
return name[0] + '*****' + name.at(-1) + '@' + domain;
}
const digits = s.match(/\d/g)!.join('');
const localNum = digits.slice(-10);
const countryCodeLen = digits.length - 10;
const result = ['***', '***', localNum.slice(-4)];
const countryCode = (countryCodeLen ? '+' : '') + '*'.repeat(countryCodeLen);
if (countryCode) result.unshift(countryCode);
return result.join('-');
}
처음에는 국가 코드를 '+'.repeat(len) + '*'.repeat(len)으로 만들었다.
입력: "86-(10)12345678"
내 출력: "++**-***-***-5678"
기대값: "+**-***-***-5678"
+와 *가 같은 개수로 늘어난다고 착각했다. 문제 예시를 다시 보면 +는 항상 1개이고, *만 국가 코드 자릿수를 따라간다. 10자리일 때는 +도 없어야 하므로 countryCodeLen ? '+' : ''로 처리했다.
s.match()는 null을 반환할 수 있어 TS strict 모드에서는 ! 또는 null 체크가 필요하다.