ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.11.21 // Programmers_핸드폰 번호 가리기
    AIL( Algorithm I Learned) 2023. 11. 21. 20:35

    ## AIL_핸드폰 번호 가리기

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

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

    ***입출력 예
    phone_number return
    "01033334444" "********4444"
    "027778888" "*****8888"

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 전화번호에서 뒷 4자리를 제외한 나머지 숫자를 모두 *로 가린 문자열을 반환하는 문제입니다. 반복문을 사용하여 적절한 횟수만큼 생성하고, 그 뒤에 전화번호의 뒷 4자리를 이어붙이는 방식으로 문제를 해결할 수 있습니다. 


    2. 문제풀이

    function solution(phone_number) {
        var answer = '';
        for(let i = 0; i < phone_number.length-4; i++) {
             answer += "*";
        }
          answer += phone_number.slice(-4);
        return answer;
    }
    /*
    테스트 1
    입력값 〉	"01033334444"
    기댓값 〉	"*******4444"
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	"027778888"
    기댓값 〉	"*****8888"
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. `for` 반복문을 사용하여 전화번호의 처음부터 뒷 4자리를 제외한 부분까지 순회합니다. 

    for(let i = 0; i < phone_number.length-4; i++) {
         answer += "*";
    }

     

    이 부분에선 `answer` 변수에 "을 추가해서 뒷자리를 뒷 4자리를 제외한 부분으로 "을 채웁니다. 반복문이 순회하면서 *이 누적되었고 `answer`에 추가됩니다. 

     

    2. `phone_number.slice(-4)`를 사용하여 전화번호의 뒷 4자리를 추출하여 이어 붙입니다.

    answer += phone_number.slice(-4);

     

    이 부분에선 `slice` 함수를 사용해서 전화번호의 뒷 4자리를 추출하고, 이를 `answer`에 이어 붙입니다. 

     

    3. 최종적으로 `answer`를 반환합니다. 


    3. 다른사람의 문제풀이 및 접근방식 분석

    const solution = n => [...n].fill("*",0,n.length-4).join("")
    /*
    테스트 1
    입력값 〉	"01033334444"
    기댓값 〉	"*******4444"
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	"027778888"
    기댓값 〉	"*****8888"
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    위 코드는 간결하게 작성하기 위해 배열의 `fill` 메소드와 spread연산자(`[...n]`)을 사용하고 있습니다. 

     

    1. `[...n]`을 사용하여 `n`이라는 문자열을 배열로 변환합니다. 여기서 `...`은 spread 연산자로, 문자열을 각 문자로 분해하여 배열로 만듭니다. 

     

    예를 들어서 "01033334444"가 입력으로 주어진다면, `[...'01033334444']`는 `['0', '1', '0', '3', '3', '3', '3', '4', '4', '4', '4']` 와 같이 배열로 변환됩니다. 

     

    2. `fill("*", 0, n.length-4)` 배열을 "로 채우는데, 0번 인덱스 부터 뒷 4자리  전까지만 "로 체웁니다. `fill` 메소드의 첫 번쨰 인자는 채울 값, 두 번째  인자는 시작 인덱스, 세 번째 인자는 끝 인덱스 입니다. 

     

    예를 들어, "01033334444"가 입력으로 주어진 경우, 이 부분은 `[ '*', '*',  '*',  '*',  '*',  '*', '4', '4', '4', '4']` 와 같이 앞부분이 '*'로 채워진 배열을 생성합니다. 

     

    3. `.join("") 배열을 문자열로 변환합니다. 배열의 각 요소를 빈 문자열("")로 구분하여 하나의 문자열로 합칩니다. 

    예를 들어, [ '*', '*',  '*',  '*',  '*',  '*', '4', '4', '4', '4']`가 입력으로 주어진 경우, 이 부분은 `""******4444"`와 같이 문자열로 변환됩니다. 

     

    따라서 최종적으로 "01033334444"가 입력으로 주어지면 "******4444"와 같은 결과를 얻게 됩니다. 


    # 다시 돌아온 fill() 메서드 기억하자! 자주 만날 예정이라 한번 더 정리하겠습니다.

    `fill()` 메서드는 배열의 모든 요소를 정적인 값으로 채우는 메서드입니다. 이 메서드는 주어진 값으로 배열을 채우고, 채울 시작 위치와 끝 위치를 선택적으로 지정할 수 있습니다. 

    array.fill(value, start, end)

    ** `value` 배열을 채울 값입니다.

    ** `start`(선택적) 배열을 채우기 시작할 인덱스입니다. 기본값은 0입니다.

    ** `end`(선택적) 배열을 채우기를 끝낼 인덱스입니다. 기본값은 배열의 길이입니다. (이 인덱스 포함x)

    // 예시 1 - 기본적인 사용
    let arr = [1, 2, 3, 4, 5];
    arr.fill(0); // 모든 요소를 0으로 채움
    // 결과: [0, 0, 0, 0, 0]
    
    // 예시 2 - 특정 범위에 대한 사용
    let arr2 = [1, 2, 3, 4, 5];
    arr2.fill(0, 1, 3); // 인덱스 1부터 3 이전까지의 요소를 0으로 채움
    // 결과: [1, 0, 0, 4, 5]
    
    // 예시 3 - 길이가 5인 배열 생성 후 사용
    let newArr = new Array(5).fill('hello'); // 길이가 5이고 모든 요소를 'hello'로 채움
    // 결과: ['hello', 'hello', 'hello', 'hello', 'hello']
Designed by Tistory.