연습장
23. 개인정보 수집 유효기간 본문
이게 어떤 약관의 종류인지?
수집일자가 언제인지?
언제까지 보관가능한지?
파기해야되는지 아닌지 ?
today : 오늘 날짜 - 파기를 판단하는 기준 일
terms : ["약관종류 기간", ... ]
privacies : ["수집일 종류", ... ]
result : [파기할privacies의 원소, ... ]
파기 일자 구하는 방법
개월에 + 해당 개월수를 더하고 , 일에서 1일을 뺀 값을 유지 기간 마지막 날이 된다.
이 날보다 today 가 이후라면 파기하게된다.
2021.05.02 A 의 경우 6개월이므로
2021.(05+6).02-1 => 2021.11.01 일 이된다.
2019.01.01 D 의 경우 5개월
2019.06.00일 이 되므로 -> 2019.05.28 일 이 된다. [모든 달은 28일 까지로 가정]
def solution(today, terms, privacies):
answer = []
# 1개의 privacies 를 가져온다.
for one_priv in privacies:
# 해당 약관의 기간을 확인
for term in terms:
if one_priv[-1] in term:
temp = term.split(' ')[1]
date = one_priv.split(' ')[0]
print(date, temp)
return answer
date : 일자
temp : 기간 이 저장되게 된다.
다음으론 위에서 정리한 '파기 일자 구하는 방법' 을 적용하여 유지 기간 을 구해본다.
def solution(today, terms, privacies):
answer = []
p_number = 1
# 1개의 privacies 를 가져온다.
for one_priv in privacies:
# 해당 약관의 기간을 확인
for term in terms:
if one_priv[-1] in term:
temp = term.split(' ')[1]
date = one_priv.split(' ')[0]
# 년, 월, 일 로 쪼개준다.
yy = date.split('.')[0]
mm = date.split('.')[1]
dd = date.split('.')[2]
# 연산 가능하도록 숫자형
yy = int(yy)
mm = int(mm) + int(temp)
dd = int(dd) - 1
# 일이 0 일 경우
if dd == 0:
dd = "28"
mm = mm - 1
# 월이 12월을 초과하는 경우
if mm > 12:
mm = mm - 12
yy = yy + 1
# 다시 문자형으로 변경
yy = str(yy)
mm = str(mm)
dd = str(dd)
# mm, dd 자릿수 조정 ex 1월 -> 01월
if len(mm) < 2:
mm = "0"+mm
if len(dd) < 2:
dd = "0"+dd
# 비교
lastday = yy+mm+dd
today = today.replace('.', '')
if today > lastday :
answer.append(p_number)
p_number += 1
return answer
오.. 굉장히 많이 빗나갔다. 이럴땐 예외 케이스가 있다기 보단 뭔가 로직을 뺴먹었을 가능성이 높다.
이럴땐 다시 로직을 처음부터 확인해보는게 좋다.
# 월이 12월을 초과하는 경우
if mm > 12:
mm = mm - 12
yy = yy + 1
이 부분에서 오류가 있었다.
mm = mm + temp 인데 단순히 12월이 넘어갈 경우 12 만 제거했는데
이러면 만약 mm 이 25월 이런식이 되어버리면 1년을 추가한 13월이 되어버린다.
2년을 추가한 1월이 되어야 하므로
이 부분에서 로직을 수정해야된다.
약관 기간인 temp 를 월에 바로 더하는게 아닌 년/ 월로 구분해서 각각 더하는게 나을꺼 같다.
30개월 -> 2년 + 6개월
대충 이런 느낌으로 적용 할 수 있다.
이렇게 바꾸게 되면 mm 의 값은 최대 12월 + 11월 해서 23월이 되며 아래의 12를 초과하는 경우에 1번만 yy 의 값을 고쳐줘도 문제가 없게 된다.
def solution(today, terms, privacies):
answer = []
p_number = 1
# 1개의 privacies 를 가져온다.
for one_priv in privacies:
# 해당 약관의 기간을 확인
for term in terms:
if one_priv[-1] in term:
temp = term[2:]
date = one_priv[:-2]
# 년, 월, 일 로 쪼개준다.
yy = date.split('.')[0]
mm = date.split('.')[1]
dd = date.split('.')[2]
# 연산
yy = int(yy) + int(temp)//12
mm = int(mm) + int(temp)%12
dd = int(dd) - 1
# 일이 0 일 경우
if dd == 0:
dd = "28"
mm = mm - 1
# 월이 12월을 초과하는 경우
if mm > 12:
mm = mm - 12
yy = yy + 1
# 다시 문자형으로 변경
yy = str(yy)
mm = str(mm)
dd = str(dd)
# mm, dd 자릿수 조정 ex 1월 -> 01월
if len(mm) < 2:
mm = "0"+mm
if len(dd) < 2:
dd = "0"+dd
# 비교
lastday = yy+mm+dd
today = today.replace('.', '')
if today > lastday :
answer.append(p_number)
p_number += 1
return answer
'프로그래머스 > 1단계' 카테고리의 다른 글
25. 공원 산책 (0) | 2024.01.22 |
---|---|
24. 달리기 경주 (0) | 2024.01.22 |
22. 바탕화면 정리 (0) | 2024.01.20 |
21. 데이터 분석 (0) | 2024.01.20 |
20. 성격 유형 검사하기 (0) | 2024.01.20 |