[알고리즘] 핸드폰 번호 가리기

DongGyu Jung·2021년 10월 3일
0
post-thumbnail

※ 본 사진과 해당 게시글 내용의 문제 모두 프로그래머스[Programmers]사이트에 발췌해왔습니다.


❓ 문제

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.

전화번호가 문자열 phone_number로 주어졌을 때, 
전화번호의 뒷 4자리를 제외한 
나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건 : s는 길이 4 이상, 20이하인 문자열입니다.

<입출력 >
phone_number	| return
"01033334444"	| "*******4444"
"027778888"	| "*****8888"

❗ 풀이

My Code

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=[여러 개가 해당할 경우, 몇 개까지만 변경할지] )
위에서 입력한 정규표현식에 해당하는 값들을 모두 *으로 바꾼 것이다.

0개의 댓글