프로그래머스 150370 : 개인정보 수집 유효 기간 [Python]

kimminjunnn·2026년 2월 3일

알고리즘

목록 보기
302/311

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/150370


문제 파악

  • today(오늘 날짜), terms(약관별 유효기간), privacies(개인정보 수집일 + 약관 종류)가 주어진다.
  • 각 개인정보는 약관 유효기간(개월)이 지나면 파기 대상이 된다.
  • 이 문제의 핵심 조건:
    • 모든 달은 28일로 고정
    • 파기해야 할 개인정보의 번호(1번부터)오름차순으로 반환

예시 입력

  • today = 2022.05.19
  • terms = [A 6, B 12, C 3]
  • privacies = [2021.05.02 A, 2021.07.01 B, 2022.02.19 C, 2022.02.20 C]

해결 아이디어

1) 날짜를 “총 일수”로 바꿔버리기

보통 날짜 문제는 월/윤년 처리 때문에 지옥인데,
이 문제는 1달 = 28일로 고정이라서 오히려 단순해진다.

그래서 날짜를 아래처럼 하나의 숫자(총 일수)로 압축하면,
만료 여부는 그냥 대소 비교로 끝난다.

  • 총일수 = Y*12*28 + M*28 + D

이렇게 하면

  • “몇 개월 더하기” → 개월 * 28 더하기
  • “오늘 이전/이후” → 정수 비교

2) 약관(term)은 딕셔너리로 매핑

terms = ["A 6", "B 12", "C 3"] 형태로 들어오니까

  • key: 약관 종류(A/B/C)
  • value: 유효기간을 일수로 바꾼 값(term*28)

로 저장해둔다.

3) privacy마다 만료일 비교

각 개인정보의 수집일을 총 일수로 바꾸고,

  • 수집일 + (약관 일수) <= 오늘 이면 만료(파기 대상)

여기서 <=를 쓰는 게 포인트:

  • “오늘이 만료일이면” → 파기 대상에 포함

해답 및 풀이(주석 코드)

# today = 2022.05.19
# terms = [A 6, B 12, C 3]
# privacies = [2021.05.02 A, 2021.07.01 B, 2022.02.19 C, 2022.02.20 C]

# 내가 return 해야 하는 것 : 파기해야 할 개인정보의 번호를 - 오름차순으로 정렬하여 - 1차원 정수 배열에 담아 reutrn
def solution(today,terms,privacies):
    # 0. today를 숫자로 만들건데 보통 이렇게 주면 어떻게 만들어야할까?
    # 날짜를 “비교/정렬/차이 계산 없이 단순 비교”만 할 거면 → yyyymmdd int
    # 날짜에 “연산(며칠 뒤, 한 달 뒤, 기간 더하기/빼기)”이 들어가면 → [Y,M,D] (또는 datetime)
    
    # 근데 이 문제는 1달이 28일이라고 고정해서 줬고, 대소를 비교해야 하는 문제이기에 그냥 total 일수로 묶어서 구현하는 것이 best이다.
    
    # 입력 받은 today -> total_day (총 일수)로 변환
    Y,M,D = map(int,today.split("."))
    total_today = Y*12*28 + M*28 + D
    
    # total_today 에 약관별 terms 를 더해 limit Day를 만들자
    limit_Day = {}
    
    # terms = ["A 6", "B 12", "C 3"]
    for type_term in terms:
        type, term = type_term.split()
        term = int(term)
        
        # limit_Day 딕셔너리에 'type'을 key, 'total_day + term*28'을 value로 가지게 해줌
        limit_Day[type] =  term*28
        
        #limit_Day = {"A":168,"B":336,"C":84}
    
    cnt = 0
    result = []
    # 이제 privacies 의 타입별로 limit_Day를 더해서 today와 비교
    # privacies = ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"]
    for privacy in privacies:
        cnt += 1
        date, type = privacy.split()
        Y,M,D = map(int,date.split("."))
        total_day = Y*12*28 + M*28 + D
        
        # 만약  total_today 가 total_day + limit_Day[type] 이보다 크거나 같다면, cnt를 result에 넣어주기
        if total_day + limit_Day[type] <= total_today:
            result.append(cnt)
    
    return result

YYYYMMDD 를 총 일수로 변환하는 로직은 두번 반복되니 함수로 빼도 좋은 코드가 될 것 같다.

profile
Frontend Engineers

0개의 댓글