[자바(JAVA)] 핸드폰 번호 가리기 replaceAll,substring

Noh Jihyeon·2023년 12월 14일
0
post-thumbnail

문제: https://school.programmers.co.kr/learn/courses/30/lessons/12948



✅ 내 풀이(최종코드)



```java
class Solution {
    public String solution(String phone_number) {
        String answer = "";
        int phoneLength = phone_number.length();  
        
        answer = "*".repeat(phoneLength-4);
        answer += phone_number.substring(phone_number.length()-4);
        return answer;
    }
}




❓ 처음엔 당연히 반복문을 사용했다. 하지만 주어진값이 최대 20자까지 되고, 문제가 간단하기 때문에
"마스킹('*') 처리만 하면 될 것 같은데 반복문을 꼭 돌려야 할까??"
라는 의문이 들어서 문자열을 대체하는 방법을 알아보았다.



1. replaceAll()과 replace() 메서드

replaceAll()과 replace() 메서드는 둘 다 문자열에서 특정 패턴을 찾아 다른 문자열로 대체하는 역할을 하지만 차이가 있다.

  1. replaceAll() 메서드:
  • 문법: replaceAll(String regex, String replacement)
  • 기능: 주어진 정규 표현식(regex)과 일치하는 모든 부분을 찾아 replacement로 대체한다.
  • 예시:위 예시에서 "o"라는 정규 표현식과 일치하는 모든 부분이 "*"로 대체되어 출력된다.
  • 주의사항:
    • replaceAll() 메서드는 정규 표현식을 사용하기 때문에 패턴이 복잡할 수 있습니다. 일반적인 문자열 대체를 위해서는 replace() 메서드를 사용하는 것이 더 편리하다.







  1. replace() 메서드:
  • 문법: replace(CharSequence target, CharSequence replacement)
  • 기능: 주어진 대상 문자열(target)과 일치하는 모든 부분을 찾아 replacement로 대체한다.
  • 예시:위 예시에서 "o"라는 대상 문자열과 일치하는 모든 부분이 "*"로 대체되어 출력된다.
  • javaCopy code
String str = "Hello, World!"; String replaced = str.replace("o", "\*");
System.out.println(replaced); // Hell\*, W\*rld!
  • 주의사항:
    • replace() 메서드는 정규 표현식을 사용하지 않으므로 간단한 문자열 대체에 적합하다.
      문자열 내에서 특정 문자 또는 문자열을 대체할 때 사용할 수 있다.
String str = "Hello, World!";
String replaced = str.replace("o", "*");
System.out.println(replaced); // Hell*, W*rld!



따라서, replaceAll() 메서드는 정규 표현식을 사용하여 문자열을 대체하고 싶을 때 사용하며, replace() 메서드는 단순히 특정 문자 또는 문자열을 대체하고 싶을 때 사용한다.
해당 문제는 특정한 단어를 대체하는게 아니기 때문에 다른 방법을 알아보았다.









2. substring()

class Solution {
    public String solution(String phone_number) {
        String answer = "";
        
        for(int i=0; i<phone_number.length()-4; i++) {
            answer += "*";
        }
        answer += phone_number.substring(phone_number.length()-4);
        return answer;
    }
}

substring() 메서드는 문자열에서 원하는 부분 문자열을 추출하는 데 사용된다.
이 문제에서는 뒤의 4자리만 기존값을 사용하고 나머지는 모두 마스킹처리를 진행하면 되기 때문에 substring()으로 필요한 부분만 추출해서 사용하는게 더 좋다고 생각한다.

substring() 메서드의 사용 예시

  1. substring(int beginIndex) 메서드:
  • beginIndex부터 문자열의 끝까지의 부분 문자열을 반환
String str = "Hello, World!";
String substr = str.substring(7);
System.out.println(substr); // "World!"
  • 위의 예시에서 substring(7)은 인덱스 7부터 문자열의 끝까지의 부분 문자열인 "World!"를 추출합니다.




  1. substring(int beginIndex, int endIndex) 메서드:
  • beginIndex부터 endIndex - 1까지의 부분 문자열을 반환
String str = "Hello, World!";
String substr = str.substring(0, 5);
System.out.println(substr); // "Hello"

콤마를 안찍으면 기입한 숫자부터 끝까지 출력



주의사항:

  • substring() 메서드는 추출된 부분 문자열을 반환하며, 원본 문자열은 변경되지 않습니다.
  • beginIndex는 추출하려는 부분 문자열의 시작 인덱스를 나타내며, endIndex는 추출하려는 부분 문자열의 끝 인덱스를 나타냅니다. endIndex는 실제 추출되는 부분 문자열에는 포함되지 않습니다.
  • 인덱스는 0부터 시작하므로 첫 번째 문자는 인덱스 0입니다.
  • beginIndex와 endIndex 값은 유효한 범위 내에 있어야 합니다. 그렇지 않으면 IndexOutOfBoundsException이 발생할 수 있습니다.

위의 사용 방법을 참고하여 substring() 메서드를 적절히 활용하여 원하는 부분 문자열을 추출할 수 있습니다.


✅다른풀이(1)

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);
  }
}

.toCharArray();

앞 부분의 배열만 바꾸면 되는거라 바꾸고 스트링으로 다시 변환하기





✅다른풀이 (2-1)

class Solution {
  public String solution(String phone_number) {
      String answer = "";

        for (int i = 0; i < phone_number.length() - 4; i++)
            answer += "*";

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

        return answer;
  }
}

✅다른풀이 (2-2)

class Solution {
    public String solution(String phone_number) {
        String answer = "";
        int phoneLength = phone_number.length();  
        
        answer = "*".repeat(phoneLength-4);
        answer += phone_number.substring(phone_number.length()-4);
        return answer;
    }
}

풀이 2번에서는 두번 사용되는 String phone_number의 길이를 변수화 시키고,
.repeat()을 활용하여 phone_number의 자리수가 달라지더라도 (phoneLength-4)번만 마스킹 처리를 진행하게 만든다.

profile
꼭꼭 씹어서 소화시키는 맛있는 코딩

0개의 댓글