문제 보기 · Level 1 · 2023 KAKAO BLIND RECRUITMENT · 정답률 52% · 푼 사람 27,747명 (2026-09-30 기준)1

문제

약관마다 보관 기간(달 수)이 정해져 있다. 개인정보마다 수집일과 약관 종류가 주어진다. 수집일에서 기간만큼 지난 날의 전날까지만 보관할 수 있다. 오늘 파기해야 할 개인정보 번호를 오름차순으로 돌려준다. 모든 달은 28일까지 있다고 본다.

  • 약관 최대 20개, 기간 1~100달
  • 개인정보 최대 100개
  • 날짜는 YYYY.MM.DD 형식, 연도 2000~2022

풀이

막히면 한 단계씩 펼친다.

필요한 개념

시간·날짜 계산: 날짜를 “며칠째” 하나의 수로 바꿔 비교한다. 모든 달이 28일이라 계산이 쉽다.

1단계 · 작은 예로 손으로 풀기

오늘 2022.05.19, 약관 A는 6달, 수집일 2021.11.19

  • 2021.11.19에서 6달 뒤는 2022.05.19다.
  • 보관은 그 전날인 2022.05.18까지다.
  • 오늘이 2022.05.19라 이미 지났다 → 파기

한 줄로 줄이면 “수집일 + 기간 ≤ 오늘이면 파기”다. 수집일 + 기간이 곧 “파기를 시작하는 날”이기 때문이다.

2단계 · 가장 단순한 방법과 그 속도

개인정보가 100개뿐이라 하나씩 확인하면 된다. 속도보다 날짜 더하기가 어렵다. 월에 6을 더하면 11월 + 6 = 17월처럼 넘쳐서 연도로 넘기는 처리가 필요하다.

3단계 · 핵심 아이디어

날짜를 “0년 1월 1일부터 며칠째”로 바꾼다. 한 달이 28일, 1년이 12 × 28일이다.

\[\text{일수} = y \times 12 \times 28 + (m - 1) \times 28 + d\]

그러면 “6달 뒤”는 그냥 6 × 28을 더하는 것이다. 월이 넘치는 처리가 필요 없다.

4단계 · 코드 흐름
  1. 날짜를 일수로 바꾸는 함수를 만든다.
  2. 오늘의 일수를 구한다.
  3. 약관 종류 → 달 수 딕셔너리를 만든다.
  4. 개인정보마다 (수집일 일수 + 달 수 × 28) ≤ 오늘 일수면 번호를 답에 넣는다. 번호는 1부터 센다.
5단계 · 파이썬 코드
def solution(today, terms, privacies):
    def to_day(date):                           # "2022.05.19" → 일수
        y, m, d = map(int, date.split("."))
        return y * 12 * 28 + (m - 1) * 28 + d

    now = to_day(today)
    months = {}
    for t in terms:                             # "A 6"
        kind, m = t.split()
        months[kind] = int(m)

    answer = []
    for i, p in enumerate(privacies, 1):        # 번호는 1부터
        date, kind = p.split()                  # "2021.05.02 A"
        if to_day(date) + months[kind] * 28 <= now:
            answer.append(i)
    return answer
  • 함수 안에 함수(to_day)를 만들 수 있다. solution 안에서만 쓰는 도우미다.
  • map(int, date.split(".")): 세 조각을 모두 정수로 바꾼다.
  • enumerate(privacies, 1): 번호를 0이 아니라 1부터 붙인다.
  • 번호를 차례로 넣으니 답은 저절로 오름차순이다.
6단계 · 실행 추적

오늘 2022.05.19, 약관 A 6달, B 12달, C 3달

번호 수집일 약관 파기 시작일 오늘 이상인가
1 2021.05.02 A 2021.11.02 예 → 파기
2 2021.07.01 B 2022.07.01 아니오
3 2022.02.19 C 2022.05.19 예 (같은 날) → 파기
4 2022.02.20 C 2022.05.20 아니오

답은 [1, 3]이다. 3번처럼 파기 시작일이 오늘과 같으면 파기한다.

7단계 · 복잡도와 흔한 실수

약관 T개, 개인정보 P개를 한 번씩 보니 \(O(T + P)\)다.

  • <=를 <로 써서 “오늘이 파기 시작일”인 경우를 놓친다.
  • 월을 직접 더하다가 13월 이상을 연도로 넘기지 않는다.
  • 번호를 0부터 센다.
검증: 문제의 예시 2개를 통과했고, 무작위 입력 2,000개에서 “연·월을 직접 더하고 넘친 월을 연도로 넘긴 뒤, 하루 전 날짜와 비교하는” 문제 문장 그대로의 풀이와 결과가 같았다 — 07_pg150370_p1.py
  1. 프로그래머스 스쿨, “개인정보 수집 유효기간” (https://school.programmers.co.kr/learn/courses/30/lessons/150370), 2026-09-30 조회. ↩