반응형
이번 문제는 '핸드폰 번호 가리기' 문제다.
과거에 풀었던 문제라 과거 코드가 남아있었다.
과거 코드
class Solution {
public String solution(String phone_number) {
String answer = "";
int len = phone_number.length();
int numberLen = len - 4;
answer = phone_number.substring(0, numberLen);
String number = phone_number.substring(numberLen, len);
answer = answer.replaceAll("[0-9]", "*");
return answer+number;
}
}
음.. 해석해 보자면 핸드폰 번호 문자열의 총길이에서 4를 뺀 나머지 값을 구하고...
substring으로 -4한 길이 값까지 자르고, 또 -4한 값에서 마지막 문자열까지 구한 다음에..
answer에 replaceAll()을 사용해서 *로 바꾼 다음에 *문자열과 맨 마지막 번호 문자열을 더한 ... 그런 해괴망측한 코드이다.
정규식을 이용해서 풀이해보고 싶었는데 정규식 기호들의 설명만 봐서는 도저히 정규식을 완성할 수 없었다.....
그래서 챗GPT에게 도움을 청했더니 자세히 알려줬다.
챗GPT가 알려준 기호를 봐도 이해가 가질 않아서 자세한 설명을 부탁했다.
- dot(.)
- 의미
- 모든 단일 문자와 매치
- ex) "abc"에서 .는 a, b, c 각각과 매치
- 제한
- 기본적으로 개행 문자(\n)와는 매치되지 않음
- 의미
- (?=...)
- 의미
- 긍정적 전방 탐색
현재 위치에서 뒤쪽으로 4개의 문자가 존재하는 경우만 조건을 만족함 - (?=.{4})는 매칭 과정에서 뒤에 정확히 4개의 문자가 있는지 확인
- 조건만 검사하며, 실제 매칭에는 포함되지 않음
- 긍정적 전방 탐색
- 의미
- .(?=.{4})
- 해석
- 현재 위치에서 문자 하나(.)를 매칭하되, 이 문자의 뒤쪽에 최소 4개의 문자가 존재해야 한다는 조건을 만족하는 경우에만 매칭
- 즉, 뒤쪽에 최소 4개의 문자가 남아있는 경우의 문자만 매칭
- 해석
매칭 과정:
- 첫 번째 문자 '0':
- 뒤에 "1012345678" → 10개의 문자가 남아 있으므로 조건 만족. 매칭.
- 두 번째 문자 '1':
- 뒤에 "012345678" → 9개의 문자가 남아 있으므로 조건 만족. 매칭.
- 세 번째 문자 '0':
- 뒤에 "12345678" → 8개의 문자가 남아 있으므로 조건 만족. 매칭.
- 네 번째 문자 '1':
- 뒤에 "2345678" → 7개의 문자가 남아 있으므로 조건 만족. 매칭.
- ...
- 마지막에서 네 번째 문자 '5':
- 뒤에 "678" → 3개의 문자가 남아 있어 조건을 만족하지 않음. 매칭되지 않음.
- 마지막 세 문자 '6', '7', '8'도 조건을 만족하지 않음.
현재 코드
class Solution {
public String solution(String phone_number) {
phone_number = phone_number.replaceAll(".(?=.{4})", "*");
return phone_number;
}
}
정규식은 기호를 사용하는만큼 어렵다...
자주 사용하지 않은 패턴을 만들어내는게 쉽지 않구만.. 그래도 어렵다고 안쓰면 고여버리니
어려워도 자주 연습해서 쓰다보면 익숙해지겠지.
오늘도 재밌는 코딩~!
반응형