[Programmers] 핸드폰 번호 가리기

2022. 10. 5. 16:24기록/Programmers

    목차

문제 설명

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때,

전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

 

제한 사항

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

 

입출력 예

phone_number return
"01033334444" "*******4444"
"027778888" "*****8888"

나의 문제 풀이

function solution(phone_number) {
  let answer = '';

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

  answer += phone_number.substring(phone_number.length - 4);

  return answer;
}

- phone_number 문자열에서 가릴 문자열의 길이만큼 for 문을 반복하면서 answer 변수에 "*" 을 더해준다.

- phone_number 문자열의 길이에서 4 만큼 뺀 인덱스부터 문자열의 마지막까지 잘라서 answer 변수에 더해준다.

 

substring() 에 인수로 인덱스 하나만 넣어주면 문자열에서 해당 인덱스부터 마지막까지 잘라서 리턴한다.

이 문제에서는 substring() 과 slice() 둘 다 사용이 가능하지만, 두 메소드에는 차이점이 존재한다.

 

String.prototype.substring()

str.substring(시작인덱스[, 종료인덱스])

substring() 메소드는 시작 인덱스부터 종료 인덱스 전 까지의 부분 문자열을 반환한다.

  • 시작인덱스가 생략된 경우, substring() 문자열의 끝까지 모든 문자를 추출한다.
  • 시작인덱스가 종료인덱스와 같을 경우, 빈 문자열을 반환한다.
  • 시작인덱스가 종료인덱스보다 큰 경우, 두 개의 인자를 바꾼 듯 작동한다.
  • 음수 인덱스는 0으로 바꾸어 작동한다.

 

Array.prototype.slice()

arr.slice(시작인덱스[, 종료인덱스])

slice() 메소드시작 인덱스부터 종료 인덱스 전까지에 대한 얕은 복사본을 새로운 배열로 반환한다. 원본 배열은 바뀌지 않는다.

  • 시작인덱스가 생략된 경우, substring() 문자열의 끝까지 모든 문자를 추출한다.
  • 시작인덱스가 종료인덱스와 같을 경우, 빈 문자열을 반환한다.
  • 시작인덱스가 종료인덱스보다 큰 경우, 빈 문자열을 반환한다.
  • 음수 인덱스는 배열의 끝에서부터의 길이를 나타낸다. 예를들어 slice(2, -1) 는 세번째부터 끝에서 두번째 요소까지 추출한다. 

 


다른 사람의 문제 풀이

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

- 정규표현식을 이용해 해당하는 문자열을 교체한 풀이이다.

 

아직 한눈에 어떤 정규식인지 알아보기가 어렵다.🥹

앞으로 정규표현식을 더욱 자세히 공부해 보아야 겠다.

 

function hide_numbers(s){
  var result = "*".repeat(s.length - 4) + s.slice(-4);
  return result;
}

- repeat() 함수를 사용하여 문자열의 길이 - 4 만큼 "*" 를 반복해서 새로운 문자열을 만든다.

- 문자열의 마지막에서 4번째부터, 마지막까지 자른다.

- 두 문자열을 연결하여 리턴한다.

 

repeat() 함수를 사용하면 간단하게 문자를 반복해서 문자열을 만들 수 있다는 것을 알게 되었다.

 

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

- for 문을 반복하면서 i 가 문자열의 길이 - 4 보다 작을 경우 "*" 를 더해주고, 아닌 경우 문자열의 해당 문자를 뽑아내어 더해준다.

 

문자열에서 문자를 하나씩 뽑아내는 charAt() 을 적절히 사용하였다.

 

const solution = n => [...n].fill("*", 0, n.length - 4).join("");

- 문자열을 배열로 만들고, 배열의 0번째 인덱스부터 마지막에서 4번째인 배열의 요소를 "*" 문자로 채운다.

- 배열의 요소를 연결해서 하나의 문자열로 만든다.

 

spread 연산자와 fill(), join() 은 문자열에 대한 문제에서 자주 함께 사용되는 것 같다.

배열의 일부 요소를 채우는 경우, fill() 함수를 사용할 때 인덱스를 지정하면 더욱 간편하게 사용할 수 있겠다.