[프로그래머스] Lv1 - 개인정보 수집 유효기간

김멉덥·2023년 7월 22일
0

알고리즘 공부

목록 보기
67/171
post-thumbnail
post-custom-banner

문제

프로그래머스 2023 KAKAO BLIND RECRUITMENT


코드 구현

def solution(today, terms, privacies):
    answer = []

    # terms -> 약관종류 유효기간
    # privacies -> 날짜 약관종류
    # privacies에 있는 날짜에 약관 유효기간을 더했을 때, 현재 날짜와 비교

    today_year = int(today.split(".")[0])       # 현재 년도
    today_month = int(today.split(".")[1])      # 현재 월
    today_day = int(today.split(".")[2])        # 현재 날짜

    terms_dict = dict()     # 약관에 대한 유효기간을 저장할 딕셔너리 (key : 약관종류, value : 유효기간)
    for i in terms:     # 딕셔너리 채우기
        terms_dict[i.split(" ")[0]] = i.split(" ")[1]

    for i in range(len(privacies)):
        p_date = privacies[i].split(" ")[0]  # 개인정보수집일자
        p_term = privacies[i].split(" ")[1]  # 약관 종류

        # 개인정보수집일자의 년도, 월, 날짜 분류
        year = int(p_date.split(".")[0])
        month = int(p_date.split(".")[1])
        day = int(p_date.split(".")[2])

        month += int(terms_dict.get(p_term))    # 선택된 약관의 유효기간을 사전에서 가져와서 현재 월 수에 더해줌

        if(month > 12):     # 만약 12가 넘는 월 수가 된다면, 년도가 바뀌어야 함
            if(month % 12 == 0):        # 12의 배수인 월 수일 때 -> 12월인건 고정
                year += month // 12 - 1
                month = 12
            else:                       # 12의 배수가 아닌 월 수일 때
                year += month // 12
                month = month % 12

        # 유효기간을 넘었는지 파악
        if(today_year > year):      # 년도가 넘었다면 무조건 지남
            answer.append(i + 1)
        if(today_year == year):         # 년도는 같은데
            if(today_month > month):    # 월 수가 넘었다면 무조건 지남
                answer.append(i + 1)
            elif(today_month == month):     # 만약 월 수도 같다면
                if(today_day >= day):       # 날짜로 비교 -> 날짜가 크다면 지남
                    answer.append(i + 1)

    return answer


if __name__ == '__main__':
    print(solution("2022.05.19", ["A 6", "B 12", "C 3"], ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]))
    print(solution("2020.01.01", ["Z 3", "D 5"], ["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"]))
    print(solution("2022.05.19", ["A 6", "B 12", "C 3"], ["2021.05.02 A", "2021.05.02 A", "2021.05.02 A", "2022.02.20 C"]))     # privacies에 같은 날짜 여러개
    print(solution("2021.12.08", ["A 18"], ["2020.06.08 A"]))       # month가 12의 배수

풀이

  • 처음 제출할 때는 테스트케이스의 절반을 틀렸다.
    → 원인 : privacies 배열에 같은 날짜가 들어가있을 때, 해당 인덱스 + 1 을 넣어주는 것이 아닌, index()로 찾아서 +1을 해줘서 넣어주었기 때문에 맨 앞에 있는 요소만 찾아서 넣어줘서 같은 숫자로만 정답이 들어갔기 때문
  • 두번째 제출에도 역시나 거의 절반을 틀렸다.
    → 원인 : 날짜 계산에서, 만약 month에 12의 배수가 들어갔을 때, 무조건 나머지로만 계산하여 month에 0이 들어갔기 때문
    • ex. 마지막 테스트케이스
      • 만약 2020.06.08 에서 18개월이 유효기간이면 만료되는 날짜는 2020.24.082021.12.08 이다.
      • 그러나 기존 코드에서는 2020.24.082022.0.08 로 날짜가 계산되어 나왔었다.
      • 따라서 만약 month에 유효기간을 더한 값이 12의 배수라면, month는 무조건 12월이고, year은 12월이 고정되었으니 12로 나눈 몫에서 -1을 해준 값이다 라는 조건을 추가해주어야 한다.
  • 따라서 위와 같은 부분을 이 문제의 코드를 짤 때 주의해야 한다 !
profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

0개의 댓글