



오늘 날짜가 "YYYY.MM.DD" 형태로 주어지는 문자열 today와,
약관 종류와 유효기간의 형태가 공백으로 구분되어 있는 문자열들을 담은 리스트 'terms',
날짜와 약관 종류가 공백으로 구분되어 있는 문자열들을 담은 리스트 'privacies'가 주어진다.
그랬을 때, 유효기한이 지나 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return해야 한다.
today = "2020.01.01"
=> 오늘 날짜 2020년 1월 1일
terms = ["Z 3", "D 5"]
=> Z 약관은 유효기간이 3개월, D 약관은 유효기간이 5개월
privacies = ["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"]
=> 19년 1월 1일에 D 약관 동의했고, 19년 11월 15일에 Z 약관, 19년 8월 2일에 D 약관, 19년 7월 1일에 D 약관, 18년 12월 28일에 Z약관 동의했는데
유효기간 지난 약관 인덱스를 오름차순으로 반환해야한다.
문제 가정상 모든 달은 28일까지만 있고,
1월 2일에 1년짜리 약관 동의했으면 유효한 날짜는 다음 년도 1월 1일까지이며, 1월 2일에 파기된다.
그렇다면 pricacies 배열을 다시 보자.
1 : 2019.01.01 D
2 : 2019.11.15 Z
3 : 2019.08.02 D
4 : 2019.07.01 D
5 : 2018.12.28 Z
Z가 3개월, D가 5개월이니 각 약관만큼 월에 더해주고, 월이 12를 넘어간다면 월-12,연+1을 해주면, 파기 시작일이 나온다.
파기 시작일은 다음과 같다.
1 : 2019.06.01
2 : 2020.02.15
3 : 2020.01.02
4 : 2019.12.01
5 : 2019.3.28
오늘 날짜는 2020.01.01
날짜를 비교해서 오늘 날짜 이하인 날들을 정답 배열에 담는다.
1 : 2019.06.01 <= 2020.01.01
2 : 2020.02.15 >= 2020.01.01
3 : 2020.01.02 >= 2020.01.01
4 : 2019.12.01 <= 2020.01.01
5 : 2019.3.28 <= 2020.01.01
=> [1,4,5] return
def solution(today, terms, privacies):
answer = []
# 1️ terms를 dict 형태로 변환 (예: {'Z': 3, 'D': 5})
terms_dict = {}
for term_month in terms:
term, month = term_month.split()
terms_dict[term] = int(month)
# 2️ today를 숫자형(YYYYMMDD)으로 변환
today_num = int(today.replace(".", ""))
# 3️ privacies 순회
for i, date_privacy in enumerate(privacies, start=1):
date, privacy = date_privacy.split() # 예: "2019.01.01", "D"
YYYY, MM, DD = map(int, date.split("."))
# 해당 약관의 유효기간 개월 수
MM += terms_dict[privacy]
# 월이 12를 넘으면 년도 증가
while MM > 12:
MM -= 12
YYYY += 1
# 파기일은 유효기간이 끝나는 다음날 직전이므로 하루 빼야 함
DD -= 1
if DD == 0:
MM -= 1
if MM == 0:
MM = 12
YYYY -= 1
# 해당 달의 마지막 날짜로 설정 (단순히 28로 처리해도 무방)
DD = 28
# 파기일을 비교용 숫자로 변환
YYYYMMDD = int(f"{YYYY:04d}{MM:02d}{DD:02d}")
# 4️ 파기일이 오늘 이전(<= today)이면 폐기 대상
if YYYYMMDD < today_num:
answer.append(i)
return answer
나중에 인덱스를 answer 리스트에 넣어줘야하기에 enumerate 를 통해 인덱싱처리를 해놓는 것과, 월의 초과값을 년도에 추가하는 로직, f-string을 통해 특정 자리수를 유지하며 정수값으로 변환하는 것, 그리고 날짜 비교를 그냥 YYYYMMDD 정수형으로 비교하는 처리가 필요한 문제였다.
