프로그래머스 : 핸드폰 번호 가리기

원녕·2024년 2월 27일
0

코드카타

목록 보기
4/5

내가 작성한 코드

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 : 조인 사용법을 잘 몰랐음

다른 코드 풀이 1

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

  1. phone_number를 string배열로 쪼개어 각 방에 나누어 담습니다.
  2. length만큼 for문을 돌게합니다.
  3. for문을 도는 도중 i가 len - 4보다 작은동안 앞번호를 *표시로 가려줍니다.
  4. 만일 if문을 빠져나와서 else로 도달하게되면 번호를 가리지않고 표기해줍니다.
  5. 그후 return하면 어떤 length값이든 뒷번호 4자리를 제외하고는 *으로 처리가 됩니다.

문제점 : 성능이슈가 발생한다.

평균 메모리 사용량: 약 74.7MB
평균 실행 시간: 약 2.07ms

실행 속도 이슈를 개선하려면 어떻게 수정하면 좋을까요??

  1. 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;

  1. 조건 검사 최적화
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가 실행속도와 메모리 사용량 모두 우수하게 나왔습니다.

  1. StringBuilder 사용의 장점:
  • 효율적인 문자열 연결: 반복적인 문자열 연결 작업에서 StringBuilder는 객체 생성 횟수를 줄여 성능 향상을 제공합니다.

  • 편리한 메소드 제공: insert, delete, reverse 등 다양한 문자열 조작 메소드를 제공하여 편리하게 사용할 수 있습니다.

  • 동기화 지원: 멀티 스레드 환경에서 안전하게 사용할 수 있도록 동기화 기능을 지원합니다.

profile
메타인지하는 개발자

0개의 댓글