Chapter02/코딩테스트

[코딩테스트 ] 프로그래머스 Lv1. 핸드폰 번호 가리기

EmmaDev_v 2025. 3. 8. 08:31

문제 설명

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

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


입출력 예

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



 

 

나의 풀이

-> 뒤에서 맨 앞 글자부터 끝에서 4번째 글자까지 *으로 치환하기.

class Solution {
    public String solution(String phone_num) {
        
        return phone_num.replaceAll(phone_num.substring(0,phone_num.length()-4),"*");
    }
}

 

 

 

틀렸다,, 이유는 replaceAll()은 해당 패턴이 있으면 전부 * 하나로 바꿔버려서 원하는 길이만큼 *이 안 생김!

그렇다고 문자열 길이를 모르니 "*******"라 할 수도 없고 ?

써칭해봤더니 정규식이 있었음 

 

 

 

class Solution {
    public String solution(String phone_num) {
        
        return phone_num.replaceAll(".(?=.{4})","*");
    }
}

 

 

 

 

다른사람의 풀이

https://school.programmers.co.kr/learn/courses/30/lessons/12948/solution_groups?language=java

class Solution {
  public String solution(String phone_number) {
     char[] ch = phone_number.toCharArray();
     for(int i = 0; i < ch.length - 4; i ++){
         ch[i] = '*';
     }
     return String.valueOf(ch);
  }
}

 

두 방법이 시간복잡도는 같고,

 

replaceAll 사용한게 볼 땐 더 직관적이지만

배열 사용하는게 메모리 사용량이 낮아서 속도가 빠르다

 

최적화가 중요하면 아래 코드, 가독성이 중요하면 위 코드 쓰면 될 듯

 

정규식 쓰면 메모리 많이 쓰는걸 몰랐당

 

 

 

 

반응형