문제 보기 · 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단계 · 코드 흐름
- 날짜를 일수로 바꾸는 함수를 만든다.
- 오늘의 일수를 구한다.
- 약관 종류 → 달 수 딕셔너리를 만든다.
- 개인정보마다 (수집일 일수 + 달 수 × 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부터 센다.
-
프로그래머스 스쿨, “개인정보 수집 유효기간” (https://school.programmers.co.kr/learn/courses/30/lessons/150370), 2026-09-30 조회. ↩