※ 본 사진과 해당 게시글 내용의 문제 모두 프로그래머스[Programmers]사이트에 발췌해왔습니다.
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때,
전화번호의 뒷 4자리를 제외한
나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
제한 조건 : s는 길이 4 이상, 20이하인 문자열입니다.
<입출력 예>
phone_number | return
"01033334444" | "*******4444"
"027778888" | "*****8888"
def solution(phone_number):
answer = phone_number.replace(phone_number[:-4], "*"*len(phone_number[:-4]))
return answer
이번 문제를 풀 때,
.replace()
라는 하위 함수를 사용했다.
phone_number[:-4]
로 마지막 4글자를 제외한 모든 문자를 선택하여
선택한 개수만큼 *
을 만들어 치환하는 방식을 사용했다.
(1)
def hide_numbers(s):
return "*"*(len(s)-4) + s[-4:]
정말 간단하게 len()
함수와 인덱싱으로 해결한 방법이다.
입력값을 바꾸어 출력하는게 아닌
입력값을 참고해서 새로운 문자열을 생성하는 방식이다.
총 길이에서 4 (마지막 4자리 의미)를 빼주어 그만큼 *
을 생성하고
입력값의 마지막 4번째 자리의 숫자부터 끝자리 숫자만 가져와 붙혀주었다.
(2)
import re
def hide_numbers(s):
p = re.compile(r'\d(?=\d{4})')
return p.sub("*", s, count = 0)
해당 풀이는 정말 독특한데 복잡하긴 하다..ㅎ
바로 정규표현식 처리에 사용하는 re
모듈을 사용한 경우이다.
우선 re.compile()
을 통해 바꿀 값의 기준을 지정해준다.
r'\d(?=\d{4})'
에서
r은 regex(정규표현식)를 의미하고 ''
안에 정규표현식을 적어준다.
처음부터 해석해보자면
\d
: digit
값 (0-9) 을 찾는다.
(?=)
: Lookahead_탐색하는 식이다.
\d{4}
: 4번 반복한 값을 찾는다.
합쳐서 \d(?=\d{4})
의 의미는
"4개의 digit값(4번 반복되는 digit)을 뒤에 붙이고 있는 앞선 숫자들" 이라고 할 수 있다.
.sub([바꿀 값], [정규표현식], count=[여러 개가 해당할 경우, 몇 개까지만 변경할지] )
로
위에서 입력한 정규표현식에 해당하는 값들을 모두 *
으로 바꾼 것이다.