Programmers coding challenge 4 : 문자 자르기

Minhyeok Kim·2022년 8월 9일
0

알고리즘(Algorithm)

목록 보기
4/5

Given description,
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 "*"으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

Given condition,
phone_number는 길이 4 이상, 20이하인 문자열입니다.

주어진 코드의 의미를 파악해보자

function solution(phone_number) {
    var answer = '';
    return answer;
}
// 핸드폰 번호를 주면 원하는 요청사항을 반영하고 answer로 반환해라
// 핸드폰 번호의 길이는 바뀔 수 있으니, 주의할 것

나의 풀이

function solution(phone_number) {
  var answer = "";
  /*
- 문자를 *로 바꾸는 방법은 ?
- 모든 숫자 *로 치환하는 방법은 replace 라는 메서드를 사용
- 맨 뒤에서 4자리를 어떻게 따로 빼지 ?? 
- 일단 잘라 낸 다음에 replace 이후에 붙여 ??
- 자르는 방법은 ?? substr(startIndex, endIndex) 를 쓰면 ?? 
- ok 그럼 맨뒤에서부터 자를 수 있어 ?
- startIndex 에 -를 붙이면 가능!!
*/
  let input = phone_number;
  let last = input.substr(-4, 4);
  /* 
  input 받은 값을 맨뒤에서 4자리 잘라주고 반환하여 맨뒤 4자리 보존
  */
  let front = input.slice(0, -4);
  // 받은 값에서 맨뒤 4자리 제외
  let star = front.replace(/[0-9]/gi, "*");
  // 맨뒤 4자리가 제외된 모든 숫자를 *로 바꿔줘
  answer = star + last;
  // 둘이 합해서 반환
  return answer;
}
// 필요했던 메서드를 이해해보자
-----------------------------------------------------------
// 먼저 replace!! replace는 
// 특정문자를 원하는 문자로 바꿔준다고 한다. 
// 대신 가장 먼저 찾은 매치되는 값만!!!
let str = "Hello world, Hello all, Hello ladys and gentlemans";
str = str.replace("Hello", "Good morning");
console.log(str);
// Good morning world, Hello all, Hello ladys and gentlemans
// 만약 동일한 모든 값을 변경하고 싶다면? : 정규 표현식 소환
let str = "Hello world, Hello all, Hello ladys and gentlemans";
str = str.replace(/hello/gi, "Good morning");
console.log(str);
// Good morning world, Good morning all, Good morning ladys and gentlemans
// 보시다시피 대소문자 상관없이 교체되는 것을 확인 할 수 있음

/*
그러나, 이번에 내가 해야할건 모든 숫자를 *로 바꿔주는것.
그렇다면 특정 문자가아닌 모든 수가 타겟이 되어야 한다. 이때 사용하는게
패턴 "/[0-9]/gi" 이다. 대괄호안에 있는 범위의 숫자를 모두 의미한다.
이런게 정규 표현식이라고 한다.*/
let str = "okn13402dnsafko19234u9235ndsanfi130314sdkflna0134108saknf";

str = str.replace(/[0-9]/gi, "");
console.log(str); // okndnsafkoundsanfisdkflnasaknf
// 0부터 9까지의 숫자를 모두 없애버렷

다른사람들의 풀이

function hide_numbers(s) {
  return s.replace(/\d(?=\d{4})/g, "*");
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));
/*
같은 replace 를 사용했지만, 
정규 표현식에서 마지막 4자리를 그냥 놔두는 방식을 채택한듯
*/

다른사람의 풀이를 이해하기 위해선 아래의 내용도 확인해야함

=> 코드를 풀어서 설명하면,

return s.replace(/\d(?=\d{4})/g, "*");

\d{4} 4자리의 숫자를 follwed 하는 숫자들 모두 로 replace 해라
== 맨 마지막 4자리르 제외하고 앞에 숫자를 모두
로 replace 해라

미쳤네ㅋ

다른 풀이 (나랑 접근방식이 비슷했지만 초깔끔)

function hide_numbers(s){
  var result = "*".repeat(s.length - 4) + s.slice(-4);
/*
*을 반복하는데 문자열의 맨뒤에서 4자리 까지만 +
맨마지막 4자리르 잘라
result에 할당하고 result를 반환
*/
  return result;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));

정규 표현식이란, "특정 패턴의 문자열"을 찾기 위한 표현 방식이다.
(이런걸 형식언어, formal language 라고 한다.)

e.g. angry person 010-1234-5678. please call him later

  • \d는 숫자를 의미하고, {}안의 숫자는 갯수를 의미한다.

  • /a/ : 문자 "a" "하나"만 찾는다
    "a"ngry person 010-1234-5678. please call him later

  • /a/g : 문자 "a" "모두" 찾는다 "
    "a"ngry person 010-1234-5678. ple"a"se c"a"ll him l"a"ter

  • /[ah0]/g : "a","h",0 중에 하나를 모두 찾는다.
    "a"ngry person "0"1"0"-1234-5678. ple"a"se c"a"ll "h"im l"a"ter

  • /[0-9]/g : 숫자 0~9까지 모두 찾는다.
    angry person 010-1234-5678. please call him later

  • [a-zA-Z]/g : 영어알파벳 대소문자 모두 찾는다.
    angry person 010-1234-5678. please call him later

  • /[^5-9]g : 숫자 5~9가 아닌 것을 모두 찾는다.
    angry person 010-1234-"5678". please call him later


사용되는 패턴을 알아보자

패턴의미
a-zA-Z영어알파벳(-으로 범위를 지정)
ㄱ-ㅎ가-힣한글문자(-으로 범위를 지정)
0-9숫자(-으로 범위를 지정)
.모든 문자열(숫자, 한글, 영어, 특수기호, 공백, 모두! 단, 줄바꿈 x)
\d숫자
\D숫자가 아닌것
\w영어 알파벳, 숫자, 언더스코어( _ )
\W\w가 아닌 것
\sspace 공백
\Sspace 공백이 아닌것
\특수기호특수기호

사용되는 기호를 알아보자

기호의미
[ ]괄호안의 문자들 중 하나
[^문자]괄호안의 문자를 제외한 것
^문자열특정 문자열로 시작(괄호없음 주의!)
문자열$특정문자열로 끝남
( )그룹 검색 및 분류(match메서드에서 그룹별로 묶어줌)
(?:패턴)그룹검색(분류x)
\b단어의 처음/끝
\B단어의 처음/끝이 아님
?최대한번(없거나 한개)
*없거나 있거나: 여러개 포함
+최소 한개(한개 또는 여러개)
{n}n개
{Min,}최소 Min개 이상
{Min, Max}최소 Min개 이상, 최대 Max개 이하

사용되는 플래그를 알아보자

플래그의미
gGlobal : 모든 문자 검색(안쓰면 매칭되는 첫 문자만 검색)
iIgnore Case : 대소문자 구분 안함
mmulti line : 여러 행의 문자열에 대해 검색

사용되는 메서드에 대해서 알아보자

메서드의미
("문자열").match(/정규표현식/플래그)"문자열"에서 "정규표현식"에 매칭되는 항목들을 배열로 반환
("문자열").replace(/정규표현식/,"대체문자열")"정규표현식"에 매칭되는 항목을 "대체문자열"로 반환
("문자열").split(정규표현식)"문자열"을 "정규표현식"에 매칭되는 항목으로 쪼개어 배열로 반환
(정규표현식).test("문자열")"문자열"이 "정규표현식"과 매칭되면 true, 아니면 false 반환
(정규표현식).exec("문자열")match 메서드와 유사(단, 무조건 첫번째 매칭 결과만 반환)

정규 표현식 예제

let text =
  "대나무 빨래 구입 문의 : http://dongumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com";

text = text.match(/https?:\/\/[\w\-\.]+/g);
/*
http로 시작하고 s가 있거나 없거나, : 나오고 /이게 2번 나오고
w(문자),-(하이픈),.(점) 으로 이루어진 
문자열이 한개이상(+)인걸 전부 찾아라(g) 
*/
console.log(text);
// [ 'http://dongumaster.com', 'http://google.com' ]

let text =
  "대나무 빨래 구입 문의 : http://dongumaster.com http://google.com 010-1111-2222 02-333-7777 curryyou@aaa.com";

text = text.match(/\d{2,3}-\d{3,4}-\d{4}/g);
/*
2자리이거나 3자리인 숫자 다음 -
3자리 이거나 4자리인 숫자 다음 -
4자리인 숫자 를
전부 찾아라(g)
*/
console.log(text);

resoucre : https://curryyou.tistory.com/234

0개의 댓글