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

나의 풀이
아마도 실패)
function solution(phone_number) {//예시로 12345
var a = phone_number/10000; //a = 1.2345 !!여기서 숫자형으로 변환됨
var b = a%1*10000; // b = 0.2345*10000 = 2345
var x= (a*10).toFixed(); // x = 문자열 12 (replace를 쓰려면 문자열이어야한다.)
return x.replace(/[0-9]/g , "*") + Math.round(b) // **2345
}
0이 제일 앞에오는 경우만 테스트를 통과한다.
이유는 둘째줄에서 숫자로 변환되며 0이 사라지기 때문!
round로 반올림 한 이유는 a를 1로 나눴을때 나머지가 거지같이 나오기 때문..
(ex 12.345 % 1 하면 12.454999999 이런식인데 왜그런진 모름)
실패2)
function solution(phone_number) {//예시로 12345
var a = phone_number/10000; //a = 1.2345 !!여기서 숫자형으로 변환됨
var b = a%1*10000; // b = 0.2345*10000 = 2345
var x= (a*10).toFixed(); // x = 문자열 12 (replace를 쓰려면 문자열이어야한다.)
return phone_number.slice(4).replace(/[0-9]/g , "*") + Math.round(b) // **2345
}
0으로 시작하는 숫자도 테스트 통과가 가능하지만 저 반올림 때문에 에러가나는듯 하다..
다 갈아 엎고 조금 더 쉽게 접근해야겠다.
성공)
function solution(phone_number) {
return phone_number.slice(4).replace(/[0-9]/g , "*") + phone_number.substr(phone_number.length-4,4)
//앞에서부터 (0으로 시작할수도 있기 때문) 4개자르고 별로 변환 + 숫자길이-4 번째 숫자부터 시작하는 4개의 숫자를 들고온다.
//ex) 01012345678 -> 2345678 -> ******* -> *******5678
생각해보니 제한 조건에서 문자열이라고 했기 때문에 굳이 이렇게 했어야했나? 싶다.
+ 이것도 너무 복잡하게 생각한듯??
모범 답안
function hide_numbers(s) {
return s.replace(/\d(?=\d{4})/g, "*");
}
정규식 공부 합시다..
정규식
1. 정규표현식 형식
/패턴/플래그
- 슬래시(/) "사이"에는 매칭시킬 "패턴"을 써준다.
- 슬래시(/) "다음"에는 옵션을 설정하는 "플래그"를 써준다.
(플래그는 하나만 찾을지, 모두 다 찾을지 등을 설정하는 옵션이라고 보면 됩니다.)
2. 정규표현식 매칭 패턴(문자, 숫자, 기호 등)
: 아래 매칭 패턴을 사용하면, 훨씬 쉽게 문자/숫자/기호를 표현할 수 있습니다.
패턴 | 의미 |
a-zA-Z | 영어알파벳(-으로 범위 지정) |
ㄱ-ㅎ가-힣 | 한글 문자(-으로 범위 지정) |
0-9 | 숫자(-으로 범위 지정) |
. | 모든 문자열(숫자, 한글, 영어, 특수기호, 공백 모두! 단, 줄바꿈X) |
\d | 숫자 |
\D | 숫자가 아닌 것 |
\w | 영어 알파벳, 숫자, 언더스코어(_) |
\W | /w 가 아닌 것 |
\s | space 공백 |
\S | space 공백이 아닌 것 |
\특수기호 | 특수기호 |
3. 정규표현식 검색 패턴
: 아래 패턴들을 이용하면, AND, OR, StartWith, EndWith 등의 다양한 조합을 만들 수 있습니다.
기호 | 의미 |
| | OR |
[] | 괄호안의 문자들 중 하나 |
[^문자] | 괄호안의 문자를 제외한 것 |
^문자열 | 특정 문자열로 시작(괄호 없음 주의!) |
문자열$ | 특정 문자열로 끝남 |
() | 그룹 검색 및 분류(match메서드에서 그룹별로 묶어줌) |
(?: 패턴) | 그룹 검색(분류X) |
\b | 단어의 처음/끝 |
\B | 단어의 처음/끝이 아님 |
4. 정규표현식 갯수(수량) 패턴
: 특정 패턴이 몇번 반복되는지도 필터링 가능합니다.
기호 | 의미 |
? | 최대 한번(없음 || 한개) |
* | 없거나 있거나 (없음 || 있음): 여러개 포함 |
+ | 최소 한개(한개 || 여러개) |
{n} | n개 |
{Min,} | 최소 Min개 이상 |
{Min, Max} | 최소 Min개 이상, 최대 Max개 이하 |
5. 정규표현식 플래그
: 플래그는 동시에 여러개 사용할 수도 있습니다. 예) gi, gm 등
플래그 | 의미 |
g | Global: 모든 문자 검색(안 쓰면 매칭되는 첫 문자만 검색) |
i | Ignore Case: 대소문자 구분 안함 |
m | Multi line: 여러 행의 문자열에 대해 검색 |
* 이외에 Singleline, Unicode, Sticky 옵션도 있는데, 잘 쓰진 않는듯 합니다.
6. 정규표현식 주요 메서드
: 자바스크립트 코드 상에서는 아래 메서드를 통해 패턴을 검사하고, .매칭되는 문자열을 추출, 변환합니다.
메서드 | 의미 |
("문자열").match(/정규표현식/플래그) | "문자열"에서 "정규표현식"에 매칭되는 항목들을 배열로 반환 |
("문자열").replace(/정규표현식/, "대체문자열") | "정규표현식"에 매칭되는 항목을 "대체문자열"로 변환 |
("문자열").split(정규표현식) | "문자열"을 "정규표현식"에 매칭되는 항목으로 쪼개어 배열로 반환 |
(정규표현식).test("문자열") | "문자열"이 "정규표현식"과 매칭되면 true, 아니면 false반환 |
(정규표현식).exec("문자열") | match메서드와 유사(단, 무조건 첫번째 매칭 결과만 반환) |
갑자기 많은 양이 나와서 놀라실 수도 있는데,
실제 사용하는 자바스크립트 코드를 보시면, 훨씬 이해가 쉬우실 겁니다.
출처: https://curryyou.tistory.com/234 [카레유]
'알고리즘' 카테고리의 다른 글
10. 행렬의 덧셈 (JavaScript) (0) | 2022.01.15 |
---|---|
14. 나누어 떨어지는 숫자 배열 (JavaScript) (0) | 2022.01.15 |
8. 평균 구하기 (JavaScript) (0) | 2022.01.15 |
7. 음양 더하기 (JavaScript) (0) | 2022.01.15 |
6. 없는 숫자 더하기 (JavaScript) (0) | 2022.01.14 |
댓글