AIL( Algorithm I Learned)

#AIL_23.11.21 // Programmers_핸드폰 번호 가리기

k0z 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']