class Solution {
public String solution(String phone_number) {
String[] phoneNumSplit = phone_number.split("");
String strPhoneNum = "";
if (phoneNumSplit.length <= 9){
for (int i = 0; i <= 5; i++){
phoneNumSplit[i] = "*";
}
}
else if (phoneNumSplit.length <= 11){
for (int i = 0; i <= 7; i++){
phoneNumSplit[i] = "*";
}
}
strPhoneNum = phoneNumSplit.join();
return strPhoneNum;
}
}
해당 문제를 풀이를 위해 작성한 주석
// 문자를 문자열배열로 쪼갠다
// length를 유동적으로 하든 뭔가 뒷자리가 4자리만 제외하고 *이 들어갈수있도록 필터링이 필요하다
// 조인 메소드를 사용해서 쪼개진 배열을 합쳐줘야한다.
// 4자리만 남았는지 어떻게 확인가능? 현재 방식은 재사용이 불가능하며 사용하려고한들 전화번호 length에 따라 수정이 이뤄져야함 애초에 틀림
// 논리 : string 이였던 phone_number를 split해서 string 배열로 만들어 for문을 각각 length가 9보다 작거나 같을떄와 7보다 작거나 같을때로 구분, 그후 join해서 return
문제점1 : length가 가변적이지 않으면 휴대폰 번호길이가 10, 12 이런식으로 늘어나버린다면
그때마다 수정해줘야함
문제점2 : 조인을 굳이 사용할 필요가 없었음
문제점3 : 조인 사용법을 잘 몰랐음
class Solution {
public String solution(String phone_number) {
// 문자를 문자열배열로 쪼갠다
// length를 유동적으로 하든 뭔가 뒷자리가 4자리만 제외하고 *이 들어갈수있도록 필터링이 필요하다
// 조인 메소드 사용법
// 4자리만 남았는지 어떻게 확인가능? 현재 방식은 재사용이 불가능하며 사용하려고한들 전화번호 length에 따라 수정이 이뤄져야함
// 논리 : string 이였던 phone_number를 split해서 string 배열로 만들고 4자리가 되기전까지는 *을 찍다가 4자 리가 되면 반복문을 빠져나온다.
String answer = "";
String[] num = phone_number.split("");
int len = num.length;
for(int i = 0; i < len; i++) {
if(i < len - 4)
answer += "*";
else
answer += num[i];
}
return answer;
}
}
출처 : 프로그래머스-핸드폰-번호-가리기-JAVAPython
- phone_number를 string배열로 쪼개어 각 방에 나누어 담습니다.
- length만큼 for문을 돌게합니다.
- for문을 도는 도중 i가 len - 4보다 작은동안 앞번호를 *표시로 가려줍니다.
- 만일 if문을 빠져나와서 else로 도달하게되면 번호를 가리지않고 표기해줍니다.
- 그후 return하면 어떤 length값이든 뒷번호 4자리를 제외하고는 *으로 처리가 됩니다.
문제점 : 성능이슈가 발생한다.
평균 메모리 사용량: 약 74.7MB
평균 실행 시간: 약 2.07ms
실행 속도 이슈를 개선하려면 어떻게 수정하면 좋을까요??
- StringBuilder의 사용
String answer = "";
String[] num = phone_number.split("");
int len = num.length;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i++) {
if (i < len - 4) {
sb.append("*");
} else {
sb.append(num[i]);
}
}
answer = sb.toString();
return answer;
- 조건 검사 최적화
String answer = "";
String[] num = phone_number.split("");
int len = num.length;
int start = len - 4;
for (int i = 0; i < len; i++) {
answer += (i < start) ? "*" : num[i];
}
return answer;
결론적으로는 StringBuilder가 실행속도와 메모리 사용량 모두 우수하게 나왔습니다.
- StringBuilder 사용의 장점:
효율적인 문자열 연결: 반복적인 문자열 연결 작업에서 StringBuilder는 객체 생성 횟수를 줄여 성능 향상을 제공합니다.
편리한 메소드 제공: insert, delete, reverse 등 다양한 문자열 조작 메소드를 제공하여 편리하게 사용할 수 있습니다.
동기화 지원: 멀티 스레드 환경에서 안전하게 사용할 수 있도록 동기화 기능을 지원합니다.