문제 설명
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 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 사용한게 볼 땐 더 직관적이지만
배열 사용하는게 메모리 사용량이 낮아서 속도가 빠르다
최적화가 중요하면 아래 코드, 가독성이 중요하면 위 코드 쓰면 될 듯
정규식 쓰면 메모리 많이 쓰는걸 몰랐당
반응형
'Chapter02 > 코딩테스트' 카테고리의 다른 글
[ 코딩테스트 ] 정수 내림차순으로 배치하기, 두 정수 사이의 합, 정수 제곱근 판별 (0) | 2025.03.10 |
---|---|
[코딩테스트] 자연수 뒤집어 배열로 만들기 (2) | 2025.03.09 |
[ 코딩테스트 ] 프로그래머스 Lv2. 기능개발 (0) | 2025.03.06 |
[ 코딩테스트 ] 프로그래머스 Lv2. 짝지어 제거하기 (0) | 2025.03.05 |
[ 코딩테스트 ] 프로그래머스 Lv2.올바른 괄호 (0) | 2025.03.02 |