문제 15 - 핸드폰 번호 가리기 (Python) + 특수 목적 정규식

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 별표(*)로 마스킹하는 문제입니다. 문자열 슬라이싱을 이용한 기본적인 풀이와 정규표현식의 전방 탐색을 활용한 심화 풀이를 정리했습니다.


1.  나의 풀이

def solution(phone_number):
    # 전체 길이에서 4를 뺀 만큼 *을 생성하고 뒷 4자리 슬라이싱 결과와 합칩니다.
    return '*' * (len(phone_number) - 4) + phone_number[-4:]

2.  오늘 배운 점 및 복기 노트

긍정형 전방 탐색(Positive Lookahead)의 활용
정규표현식에서 (?=X) 형태의 전방 탐색은 특정 패턴 X가 뒤에 오는 경우에만 앞의 패턴을 매칭합니다. 이때 X에 해당하는 부분은 검색 결과에 포함되지 않으므로, 치환 대상에서 제외하고 싶을 때 유용하게 사용할 수 있습니다.

데이터의 보존과 치환의 분리
단순히 모든 숫자를 찾는 \d와 달리, \d(?=\d{4}) 패턴을 사용하면 뒤에 4개의 숫자가 더 존재하는 숫자들만 선택합니다. 이는 마지막 4자리를 보존해야 하는 문제 조건에 정확히 부합하는 테크닉임을 학습했습니다.


3.  프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점

정규표현식 sub 함수를 이용한 간결한 처리
파이썬의 re.sub() 함수를 활용하면 문자열의 길이를 직접 계산하지 않고도 조건에 맞는 부분만 선별하여 치환할 수 있습니다. 코드는 다음과 같습니다.

import re

def solution(s):
    # 뒤에 숫자 4개가 따라오는 숫자(\d)를 모두 *로 치환합니다.
    return re.sub('\d(?=\d{4})', '*', s)


파이썬 문자열 객체의 특성과 효율성
파이썬의 문자열은 수정 불가능(Immutable)한 객체입니다. 따라서 반복적인 + 연산자를 사용한 문자열 결합은 매번 새로운 객체를 생성하므로 비용이 큽니다. 대량의 문자열을 합칠 때는 리스트에 담아 "".join()을 사용하는 것이 성능 면에서 유리함을 명심해야 합니다.

 

4.  특수 목적으로 사용하는 정규표현식 요약

교재에서 소개된 전/후방 탐색(Lookaround) 표기법과 의미를 정리했습니다.
탐색된 부분에서 특정 부분만큼 결과에서 제외하고 싶을 때 유용하게 사용됩니다.

표기법 의미 설명
(?=X) 긍정형 전방 탐색 패턴 뒤에 X가 오는 경우만 일치
(?!X) 부정형 전방 탐색 패턴 뒤에 X가 오지 않는 경우만 일치
(?<=X) 긍정형 후방 탐색 패턴 앞에 X가 있는 경우만 일치
(?<!X) 부정형 후방 탐색 패턴 앞에 X가 없는 경우만 일치