관리 메뉴

공부기록용

프로그래머스(LV 1. 핸드폰 번호 가리기) 본문

✍️문제풀기✍️/JS_Programmers school

프로그래머스(LV 1. 핸드폰 번호 가리기)

과부하가즈아 2023. 6. 21. 19:00

LV 1. 핸드폰 번호 가리기

https://school.programmers.co.kr/learn/courses/30/lessons/12948

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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

제한 조건
  • phone_number는 길이 4 이상, 20이하인 문자열입니다.

입출력 예

  • phone_number = "01033334444"
  • return = "*******4444"
<해결>
function solution(phone_number) {
    var answer = '';

    answer = "*".repeat(phone_number.length - 4) + phone_number.slice(-4);
    // return "*".repeat(phone_number.length - 4).concat(phone_number.slice(-4));
    // phone_number.length의 -4까지 *을 반복하고,  붙여줘(+로 형 변환)
    // phone_number의 배열에서 뒤에서 4번째까지 잘라서

    return answer;
}
console.log(solution("01033334444"))​

🔴배운거 정리

 

> .join

> .join("") : 배열의 원소를 문자열로 합치기

var a = ['바람', '비', '불'];
var myVar1 = a.join();      // myVar1에 '바람,비,불'을 대입
var myVar2 = a.join(', ');  // myVar2에 '바람, 비, 불'을 대입
var myVar3 = a.join(' + '); // myVar3에 '바람 + 비 + 불'을 대입
var myVar4 = a.join('');    // myVar4에 '바람비불'을 대입

// 바람,비,불
// 바람, 비, 불
// 바람 + 비 + 불
// 바람비불

> .charAt() 

> .charAt() : 함수는 문자열에서 특정 인덱스에 위치하는 유니코드 단일문자를 반환

str.charAt(index)
  • 문자열 내의 문자는 왼쪽에서 오른쪽으로 순번(인덱스)이 매겨집니다.
  • 0과 문자열의 길이 - 1 사이의 정수값.
  • 지정된 인덱스에 해당하는 유니코드 단일문자를 반환한다.
  • 인자를 생략하면 기본값으로 0를 설정되고 첫 문자를 반환한다.
  • 만약 인덱스가 문자열 길이보다 큰 경우 빈 문자열 (예) " " 을 반환한다.
  • 문자열의 마지막 문자 순번은 stringName.length - 1 입니다.
var anyString = 'Brave new world';
console.log(anyString.charAt(0));
console.log(anyString.charAt()); // 비어있는 경우 0으로 인식
console.log(anyString.charAt(999)); // 길이를 벗어나면 빈 문자열을 반환

<배운걸로 적용해보기>

// map사용
function solution(x) {
    return x
        .split("") // 배열
        .map((acc, i, arr) => (i < arr.length - 4 ? (acc = "*") : acc)) //map
        .join("");
}
console.log(solution("01033334444"))

> split로 배열을 찢음 -> [ '0', '1', '0', '3', '3', '3', '3', '4', '4', '4', '4' ]

> .map( ) 사용, 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환

> 찢겨 생긴 이 배열(arr)인 [ '0', '1', '0', '3', '3', '3', '3', '4', '4', '4', '4' ]의 i번째의 요소를 --해서 acc에 모아 배열을 만듦 

> 호출한 배열이 arr이고, 이 arr의 길이에서 -4한 값이 i보다 크다면? 참_acc는 *되고 : 거짓(해당되지않는다면)_ 변화없이 acc

> 뒤에서 4자리는 숫자, 그 앞은 모두 *로 표시하고자 함 그래서 전체의 길이인 length에서 뒤에서 4자리에 해당하는 4를 -해줌

> 인덱스 번호로 계산되는 i랑 길이로 계산되는 length랑 1자리 차이 나므로 =의 조건은 걸지 않음 만약 =이 들어가면 - 5가 되어야함

> join을 통해서 마지막으로 변형된 값의 배열을 문자열로 묶어줌 


// charAt()
function solution(phone_number) {
    var result = "";

    for (var i = 0; i < phone_number.length; i++) {
        result += i < phone_number.length - 4 ? "*" : phone_number.charAt(i);
    }

    return result;
}
console.log(solution("01033334444"))

> 마지막 삼항연산자를 살펴보면

> result에 값을 더해가는데 그 값은 

> phone_number의 길이에서 -4를 한 값이 i보다 크면?  참(i가 작음)_*을 더해가고 : 거짓(i가 커지면)_i요소의 문자를 반환한다는 의미

> 이걸 for문을 통해 phone_number의 길이만큼 돌아가는 것

> 그래서 길이로는11, 인덱스로는10 까지의 범위에서 인덱스 i가 0~6까지 *로써 result에 저장되고 7,8,9,10까지는 숫자로 나타남 


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

정규 표현식 /d (?=\d{4}) /g

> \d : 하나의 숫자를 의미한다.

> (?=\d{4}) : 숫자의 뒤에 4개의 숫자가 있는지 검사하는 전방 탐색(lookahead)이다.(이를 통해 4개의 숫자 중 마지막 숫자만 제외하고 숨긴다.)

> g : 전역 검색을 수행하여 문자열 내의 모든 해당 패턴을 찾는다.

Comments