연습장

23. 개인정보 수집 유효기간 본문

프로그래머스/1단계

23. 개인정보 수집 유효기간

js0616 2024. 1. 22. 10:50

 

이게 어떤 약관의 종류인지?

수집일자가 언제인지?

언제까지 보관가능한지?

파기해야되는지 아닌지 ?

 

 

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개월

 

temp = 30

yy = 1 + temp//12
mm = 2 + temp%12

print(yy, mm ) # 3 8

 

대충 이런 느낌으로 적용 할 수 있다. 

 

이렇게 바꾸게 되면 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