본문 바로가기
● 알고리즘, 자료구조/2021 알고리즘

주민번호 가리기 | 함수, 리스트, 문자열

by 0ver-grow 2021. 5. 31.
반응형

문제 : 

주민번호에서 맨 뒷자리 4개만 *로 수정한다.

 

기본 코드

def mask_security_number(security_number):

# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))


시행 착오 1 : 별표 변환이 이상하다.

무엇이 문제일까?

def mask_security_number(security_number):
    security_number = list(security_number)
    for i in range(len(security_number)-1,9,-1) :  # 역순
        security_number[i] = "*"  # 맨 뒤
        i -= 1
    return security_number

# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))

실행결과에서 하이픈이 있는 경우에만 4자리가 *로 수정되고 하이픈이 없으면 3자리만 *로 수정된다.

 

시행 착오2 : 리스트에서 문자열로 변환하기

무엇이 문제일까?

def mask_security_number(security_number):
    security_number = list(security_number)
    
    # 역순 반복
    # 시작 인덱스가 제일 끝부분, 엔딩 인덱스는 끝에서 4번째
    for i in range(len(security_number)-1,len(security_number)-5,-1) :  
        security_number[i] = "*"  # 맨 뒤
        i -= 1
    
    # 리스트 -> 문자열 변환    
    security_number = str(security_number)
    return security_number

# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))

문제 해결

def mask_security_number(security_number):
    # 파라미터 str 타입 > list 타입 변환
    security_number = list(security_number)
    
    # 역순 반복
    # 시작 인덱스가 제일 끝부분, 엔딩 인덱스는 끝에서 4번째
    for i in range(len(security_number)-1,len(security_number)-5,-1) :  
        security_number[i] = "*"  # 맨 뒤
        i -= 1
    
    # 리스트 -> 문자열 변환
    security_number = "".join(security_number)
    return security_number

 

내가 푼 문제2

 

def mask_security_number(security_number):
    # 파라미터는 str타입
    
    new_list = []
    
    # str을 수정하기 위해 리스트로 변환1
    new_list = list(security_number)
    
    '''
    # str을 수정하기 위해 리스트로 변환2
    for index in range(len(security_number)) :
        new_list.append(security_number[index])
    '''
    
        
    # -4번째 인덱스 ~ -1 인덱스까지 *로 변환
    for index in range(-4,0) :
        new_list[index] = "*"
       
    new_list = "".join(new_list)
    
    return new_list

모범 답안1

def mask_security_number(security_number):
    # security_number를 리스트로 변환
    num_list = list(security_number)

    # 마지막 네 값을 *로 대체
    for i in range(len(num_list) - 4, len(num_list)):
        num_list[i] = "*"

    # 리스트를 문자열로 복구
    total_str = ""
    for i in range(len(num_list)):
        total_str += num_list[i]

    return total_str

모범 답안2

def mask_security_number(security_number):
    num_list = list(security_number)

    # 마지막 네 값을 *로 대체
    for i in range(len(num_list) - 4, len(num_list)):
        num_list[i] = '*'

    # 리스트를 문자열로 복구하여 반환
    return ''.join(num_list)

 

모범 답안3 : 문자열을 리스트로 변경하지 않아도 문자열을 변경할 수 있구나.

def mask_security_number(security_number):
    return security_number[:-4] + '****'


# 테스트
print(mask_security_number("880720-1234567"))
print(mask_security_number("8807201234567"))
print(mask_security_number("930124-7654321"))
print(mask_security_number("9301247654321"))
print(mask_security_number("761214-2357111"))
print(mask_security_number("7612142357111"))
반응형