



문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/150370
today(오늘 날짜), terms(약관별 유효기간), privacies(개인정보 수집일 + 약관 종류)가 주어진다.예시 입력
보통 날짜 문제는 월/윤년 처리 때문에 지옥인데,
이 문제는 1달 = 28일로 고정이라서 오히려 단순해진다.
그래서 날짜를 아래처럼 하나의 숫자(총 일수)로 압축하면,
만료 여부는 그냥 대소 비교로 끝난다.
총일수 = Y*12*28 + M*28 + D이렇게 하면
개월 * 28 더하기terms = ["A 6", "B 12", "C 3"] 형태로 들어오니까
로 저장해둔다.
각 개인정보의 수집일을 총 일수로 바꾸고,
수집일 + (약관 일수) <= 오늘 이면 만료(파기 대상)여기서 <=를 쓰는 게 포인트:
# today = 2022.05.19
# terms = [A 6, B 12, C 3]
# privacies = [2021.05.02 A, 2021.07.01 B, 2022.02.19 C, 2022.02.20 C]
# 내가 return 해야 하는 것 : 파기해야 할 개인정보의 번호를 - 오름차순으로 정렬하여 - 1차원 정수 배열에 담아 reutrn
def solution(today,terms,privacies):
# 0. today를 숫자로 만들건데 보통 이렇게 주면 어떻게 만들어야할까?
# 날짜를 “비교/정렬/차이 계산 없이 단순 비교”만 할 거면 → yyyymmdd int
# 날짜에 “연산(며칠 뒤, 한 달 뒤, 기간 더하기/빼기)”이 들어가면 → [Y,M,D] (또는 datetime)
# 근데 이 문제는 1달이 28일이라고 고정해서 줬고, 대소를 비교해야 하는 문제이기에 그냥 total 일수로 묶어서 구현하는 것이 best이다.
# 입력 받은 today -> total_day (총 일수)로 변환
Y,M,D = map(int,today.split("."))
total_today = Y*12*28 + M*28 + D
# total_today 에 약관별 terms 를 더해 limit Day를 만들자
limit_Day = {}
# terms = ["A 6", "B 12", "C 3"]
for type_term in terms:
type, term = type_term.split()
term = int(term)
# limit_Day 딕셔너리에 'type'을 key, 'total_day + term*28'을 value로 가지게 해줌
limit_Day[type] = term*28
#limit_Day = {"A":168,"B":336,"C":84}
cnt = 0
result = []
# 이제 privacies 의 타입별로 limit_Day를 더해서 today와 비교
# privacies = ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]
for privacy in privacies:
cnt += 1
date, type = privacy.split()
Y,M,D = map(int,date.split("."))
total_day = Y*12*28 + M*28 + D
# 만약 total_today 가 total_day + limit_Day[type] 이보다 크거나 같다면, cnt를 result에 넣어주기
if total_day + limit_Day[type] <= total_today:
result.append(cnt)
return result
YYYYMMDD 를 총 일수로 변환하는 로직은 두번 반복되니 함수로 빼도 좋은 코드가 될 것 같다.