Algorithm

[카카오 코테 2023 | python] 개인정보 수집 유효기간

삐롱K 2025. 6. 18. 11:33
728x90
반응형

 

Q1) 문제를 어떻게 이해했는지
A1) 이 문제는 개인정보가 저장된 날짜와 약관 종류를 기반으로, 각 개인정보의 만료일을 계산한 뒤, 오늘 날짜 기준으로 만료되었는지를 판단해 파기해야 할 개인정보의 인덱스를 구하는 문제입니다.
모든 달이 28일로 고정되어 있으므로, 날짜를 일(day) 단위로 변환해서 비교하면 됩니다.
Q2) 어떤 식으로 풀건지
A2) 
- 우선 terms를 약관종류별 유효기간을 갖는 딕셔너리로 변환합니다.
- today 날짜를 총 일 수(day)로 변환합니다.
- 각 privacies 항목에 대해: 수집일을 총 일 수로 변환합니다. 해당 약관의 유효기간(개월 수)을 일 수로 바꿔 더해서 만료일을 구합니다. 만료일이 today보다 작거나 같다면 파기 대상이므로 해당 인덱스를 저장합니다.
- 마지막으로 파기 대상 개인정보 번호를 오름차순으로 리턴합니다.

 

💡 최적 코드

def date_to_days(date):
    y, m, d = map(int, date.split("."))
    return y*12*28 + m*28 + d

def solution(today, terms, privacies):
    term_dict = {}
    for term in terms:
        tm_type, tm_m = term.split(" ")
        term_dict[tm_type] = tm_m

    answer = []
    today_days = date_to_days(today)
    for i, privacy in enumerate(privacies):
        start_days = date_to_days(privacy.split(" ")[0])
        type = privacy.split(" ")[1]
        expiry_days = start_days + int(term_dict[type])*28

        if expiry_days <= today_days:
            answer.append(i + 1)

    return answer

 


+ Bonus🔥) 28일로 고정되어있지 않은 경우
dt = datetime.strptime("2022.05.19 13:45", "%Y.%m.%d %H:%M") # datetime.datetime(2022, 5, 19, 13, 45)
print("연:", dt.year)    # 2022
print("월:", dt.month)   # 5
print("일:", dt.day)     # 19
print("시:", dt.hour)    # 13
print("분:", dt.minute)  # 45
print("초:", dt.second)  # 0 (초를 넣지 않았기 때문에 기본값 0)

from datetime import datetime
from dateutil.relativedelta import relativedelta

def solution(today, terms, privacies):
    today = datetime.strptime(today, "%Y.%m.%d")
    term_dict = {t.split()[0]: int(t.split()[1]) for t in terms}
    answer = []

    for i, record in enumerate(privacies):
        date_str, term_type = record.split()
        collected_date = datetime.strptime(date_str, "%Y.%m.%d")
        expired_date = collected_date + relativedelta(months=term_dict[term_type])
        
        if expired_date <= today:
            answer.append(i + 1)
    
    return answer

 

함수 / 속성

datetime.now() 현재 날짜와 시간 반환
datetime.strptime(str, format) 문자열 → 날짜 객체 변환
datetime.strftime(format) 날짜 객체 → 문자열 변환
datetime(year, month, day, hour, min, sec) 특정 날짜/시간 객체 생성
date.year / date.month / date.day 연도, 월, 일 추출

 

상대 날짜 계산 예

from datetime import datetime
from dateutil.relativedelta import relativedelta

now = datetime.now()

print("오늘:", now.strftime("%Y-%m-%d"))
print("1주일 전:", (now - relativedelta(weeks=1)).strftime("%Y-%m-%d"))
print("내년 오늘:", (now + relativedelta(years=1)).strftime("%Y-%m-%d"))
print("100일 후:", (now + relativedelta(days=100)).strftime("%Y-%m-%d"))
728x90
반응형