본문 바로가기

CODING TEST/ALGORITHM - 문제

[2023 KAKAO BLIND RECRUITMENT/프로그래머스] 개인정보 수집 유효기간 - Python

코딩테스트 연습 - 개인정보 수집 유효기간 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 요약 

고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다.

수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

모든 달은 28일까지 있다고 가정합니다.

 

- 매개변수

오늘 날짜를 의미하는 문자열 today

약관의 유효기간을 담은 1차원 문자열 배열 terms

수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies

 

- return 값

파기해야 할 개인정보의 번호를 오름차순으로 담은 1차원 정수 배열

 

 

문제 풀이

def solution(today, terms, privacies):
    answer = []
    
    # today 분리
    today_year, today_mon, today_day = list(map(int, today.split('.')))

    # terms 분리
    term_dict = {}
    for x in terms:
        term, term_mon = x.split(' ')
        term_dict[term] = term_mon
        
    # privacies 분리
    for num, x in enumerate(privacies, 1):
        priv_date, priv_term = x.split(' ')
        priv_year, priv_mon, priv_day = list(map(int, priv_date.split('.')))
        
        # 유효기간 날짜 계산 
        month = priv_mon + int(term_dict[priv_term])
        year = priv_year
        
        while month > 12:
            year += 1
            month -=12
            
        day = priv_day-1     
        if day < 1:  # 개인정보 수집 일자가 1일일 경우
            day = 28
            month -= 1

        # 유효기간과 오늘 비교
        # 유효기간이 지나지 않은 경우 continue
        if year > today_year:
            continue
        if year == today_year:
            if month > today_mon: 
                continue
            if month == today_mon: 
                if day >= today_day: 
                    continue
        
        answer.append(num)                               
    return answer

 

모든 달이 28일까지 있다는 가정이 있어서 굳이 datetime을 사용하지 않고 풀이했다.

유효기간이 아주 긴 경우(ex.30달)를 고려하지 않아서 처음에는 month에도 1을 빼는 방식으로 풀어서 실패했다.

그래서 while문으로 변경해서 날짜를 계산했다!

while문 없이는 %를 사용하면 가능하다.