05의 개발 계발

[알고리즘] 230426 개인정보 수집 유효기간 본문

알고리즘

[알고리즘] 230426 개인정보 수집 유효기간

생각하는 코댕이 2023. 4. 26. 08:14
728x90

개인정보 수집 유효기간

내 코드

def solution(today, terms, privacies):
    #오늘 날짜를 년,월,일 로 받은 후 → 일단위로 변환하여 저장
    [year,month,day] = today.split(".")
    today = sum([int(year)*12*28,int(month)*28,int(day)])
    #약관종류와 유효기간이 쌍값 → dict저장 + 유효기간은 일단위로
    terms_dict = {}
    for term in terms:
        typ,exp = term.split(" ")
        terms_dict[typ] = int(exp)*28
    #파기목록 선언
    expired_list = []
    #개인정보 수집일자와 약관종류 분리
    for i,privacie in enumerate(privacies,1):
        day,typ = privacie.split(" ")
        #수집일자 일단위로 변환
        [year,month,day] = day.split(".")
        day = sum([int(year)*12*28,int(month)*28,int(day)])
        #약관종류 별 유효성 판별하여 파기목록에 추가
        for typ_,exp in terms_dict.items():
            if typ == typ_:
                if (today-day) >= exp:
                    expired_list.append(i)  
    return expired_list

+테스트용 코드

더보기
import os
os.system("cls")

def solution(today, terms, privacies):
    #오늘 날짜를 년,월,일 로 받은 후 → 일단위로 변환하여 저장
    [year,month,day] = today.split(".")
    today = sum([int(year)*12*28,int(month)*28,int(day)])
    #약관종류와 유효기간이 쌍값 → dict저장 + 유효기간은 일단위로
    terms_dict = {}
    for term in terms:
        typ,exp = term.split(" ")
        terms_dict[typ] = int(exp)*28
    #파기목록 선언
    expired_list = []
    #개인정보 수집일자와 약관종류 분리
    for i,privacie in enumerate(privacies,1):
        day,typ = privacie.split(" ")
        #수집일자 일단위로 변환
        [year,month,day] = day.split(".")
        day = sum([int(year)*12*28,int(month)*28,int(day)])
        #약관종류 별 유효성 판별하여 파기목록에 추가
        for typ_,exp in terms_dict.items():
            if typ == typ_:
                if (today-day) >= exp:
                    expired_list.append(i)  
    return expired_list

# ===============테스트공간==================

today1="2022.05.19"
terms1=["A 6", "B 12", "C 3"]
privacies1=["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]
#[1, 3]

today2="2020.01.01"
terms2=["Z 3", "D 5"]
privacies2=["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"]
#[1, 4, 5]

print("정답[1, 3] |",solution(today1, terms1, privacies1))
print("정답[1, 4, 5] |",solution(today2, terms2, privacies2))
#리팩토링 | 직관적으로 변수 수정 , 공통적인 일단위 변환 함수화
def solution(today, terms, privacies):
    
    def to_day(date_str):
        # 날짜 문자열을 일단위 정수로 변환하는 함수
        year, month, day = map(int, date_str.split("."))
        return year * 12 * 28 + month * 28 + day

    today_day = to_day(today)
    term_dict = {typ: int(exp) * 28 for typ, exp in (term.split() for term in terms)}
    expired_list = []
    for i, privacy in enumerate(privacies, 1):
        date_str, typ = privacy.split()
        privacy_day = to_day(date_str)
        if (today_day - privacy_day) >= term_dict.get(typ, 0):
            expired_list.append(i)
    return expired_list

흠터레스팅 코드

# map활용 슬라이싱활용

def to_days(date):
    year, month, day = map(int, date.split("."))
    return year * 28 * 12 + month * 28 + day

def solution(today, terms, privacies):
    months = {v[0]: int(v[2:]) * 28 for v in terms}
    today = to_days(today)
    expire = [
        i + 1 for i, privacy in enumerate(privacies)
        if to_days(privacy[:-2]) + months[privacy[-1]] <= today
    ]
    return expire

새로 알게된 것

함수 내에서도 반복되는 변환이 있다면 내장함수를 정의하여 활용하는 것도 좋은 방법이다. 

728x90