개인정보 수집 유효기간 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""개인정보 수집 유효기간 (프로그래머스 150370) 풀이와 검증."""
import random


def solution(today, terms, privacies):
    def to_day(date):
        y, m, d = map(int, date.split("."))
        return y * 12 * 28 + (m - 1) * 28 + d

    now = to_day(today)
    months = {}
    for t in terms:
        kind, m = t.split()
        months[kind] = int(m)
    answer = []
    for i, p in enumerate(privacies, 1):
        date, kind = p.split()
        if to_day(date) + months[kind] * 28 <= now:
            answer.append(i)
    return answer


def literal(today, terms, privacies):
    """월을 직접 더하고 넘치면 연도로 넘긴 뒤, '보관 가능한 마지막 날'과 오늘을 (연, 월, 일)로 비교한다."""
    ty, tm, td = map(int, today.split("."))
    months = {k: int(v) for k, v in (t.split() for t in terms)}
    out = []
    for i, p in enumerate(privacies, 1):
        date, kind = p.split()
        y, m, d = map(int, date.split("."))
        m += months[kind]
        while m > 12:
            m -= 12
            y += 1
        d -= 1                    # 전날까지 보관
        if d == 0:
            d = 28
            m -= 1
            if m == 0:
                m = 12
                y -= 1
        if (ty, tm, td) > (y, m, d):
            out.append(i)
    return out


def rand_date(rng):
    return f"{rng.randint(2000, 2022)}.{rng.randint(1, 12):02d}.{rng.randint(1, 28):02d}"


if __name__ == "__main__":
    assert 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"]) == [1, 3]
    assert 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"]) == [1, 4, 5]
    rng = random.Random(150370)
    for _ in range(2000):
        kinds = rng.sample("ABCDEFGHIJ", rng.randint(1, 5))
        terms = [f"{k} {rng.randint(1, 100)}" for k in kinds]
        today = rand_date(rng)
        privacies = [f"{rand_date(rng)} {rng.choice(kinds)}" for _ in range(rng.randint(1, 10))]
        assert solution(today, terms, privacies) == literal(today, terms, privacies)
    print("ALL CHECKS PASSED")