- 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/150370
- level 1
- 2023 KAKAO BLIND RECRUITMENT
Q1) 문제를 어떻게 이해했는지
A1) 이 문제는 개인정보가 저장된 날짜와 약관 종류를 기반으로, 각 개인정보의 만료일을 계산한 뒤, 오늘 날짜 기준으로 만료되었는지를 판단해 파기해야 할 개인정보의 인덱스를 구하는 문제입니다.
모든 달이 28일로 고정되어 있으므로, 날짜를 일(day) 단위로 변환해서 비교하면 됩니다.
Q2) 어떤 식으로 풀건지
A2)
- 우선 terms를 약관종류별 유효기간을 갖는 딕셔너리로 변환합니다.
- today 날짜를 총 일 수(day)로 변환합니다.
- 각 privacies 항목에 대해: 수집일을 총 일 수로 변환합니다. 해당 약관의 유효기간(개월 수)을 일 수로 바꿔 더해서 만료일을 구합니다. 만료일이 today보다 작거나 같다면 파기 대상이므로 해당 인덱스를 저장합니다.
- 마지막으로 파기 대상 개인정보 번호를 오름차순으로 리턴합니다.
💡 최적 코드
def date_to_days(date):
y, m, d = map(int, date.split("."))
return y*12*28 + m*28 + d
def solution(today, terms, privacies):
term_dict = {}
for term in terms:
tm_type, tm_m = term.split(" ")
term_dict[tm_type] = tm_m
answer = []
today_days = date_to_days(today)
for i, privacy in enumerate(privacies):
start_days = date_to_days(privacy.split(" ")[0])
type = privacy.split(" ")[1]
expiry_days = start_days + int(term_dict[type])*28
if expiry_days <= today_days:
answer.append(i + 1)
return answer
+ Bonus🔥) 28일로 고정되어있지 않은 경우
dt = datetime.strptime("2022.05.19 13:45", "%Y.%m.%d %H:%M") # datetime.datetime(2022, 5, 19, 13, 45) print("연:", dt.year) # 2022 print("월:", dt.month) # 5 print("일:", dt.day) # 19 print("시:", dt.hour) # 13 print("분:", dt.minute) # 45 print("초:", dt.second) # 0 (초를 넣지 않았기 때문에 기본값 0) from datetime import datetime from dateutil.relativedelta import relativedelta def solution(today, terms, privacies): today = datetime.strptime(today, "%Y.%m.%d") term_dict = {t.split()[0]: int(t.split()[1]) for t in terms} answer = [] for i, record in enumerate(privacies): date_str, term_type = record.split() collected_date = datetime.strptime(date_str, "%Y.%m.%d") expired_date = collected_date + relativedelta(months=term_dict[term_type]) if expired_date <= today: answer.append(i + 1) return answer
함수 / 속성
| datetime.now() | 현재 날짜와 시간 반환 |
| datetime.strptime(str, format) | 문자열 → 날짜 객체 변환 |
| datetime.strftime(format) | 날짜 객체 → 문자열 변환 |
| datetime(year, month, day, hour, min, sec) | 특정 날짜/시간 객체 생성 |
| date.year / date.month / date.day | 연도, 월, 일 추출 |
상대 날짜 계산 예
from datetime import datetime
from dateutil.relativedelta import relativedelta
now = datetime.now()
print("오늘:", now.strftime("%Y-%m-%d"))
print("1주일 전:", (now - relativedelta(weeks=1)).strftime("%Y-%m-%d"))
print("내년 오늘:", (now + relativedelta(years=1)).strftime("%Y-%m-%d"))
print("100일 후:", (now + relativedelta(days=100)).strftime("%Y-%m-%d"))
[추천 강의✨]
38군데 합격 비법, 2025 코딩테스트 필수 알고리즘| 딩코딩코 - 인프런 강의
현재 평점 5.0점 수강생 2,019명인 강의를 만나보세요. 초보자도 쉽게 이해하는 단계별 설명으로, 막연했던 코딩 테스트가 명확해집니다. 필요한 것만 배우고 바로 실전에 적용하세요! 알고리즘,
www.inflearn.com
6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법| 딩코딩코 - 인
현재 평점 5.0점 수강생 457명인 강의를 만나보세요. 모든 이력서가 비슷해 보이는 세상, ‘차별화’가 합격을 만듭니다. 6주간, 백엔드 실무자가 직접 전하는 실전 이력서 전략 4가지를 배우세요.
www.inflearn.com
728x90
반응형
'Algorithm' 카테고리의 다른 글
| [카카오 코테 2018 | python] 비밀지도 (0) | 2025.06.19 |
|---|---|
| [카카오 코테 2018 | python] [1차] 다트 게임 (0) | 2025.06.19 |
| [카카오 코테 2022 | python] 양궁대회 (0) | 2025.06.17 |
| [카카오 코테 2019 | python] 오픈 채팅방 ✅ (0) | 2025.06.17 |
| [카카오 코테 2022 | python] k진수에서 소수 개수 구하기 (0) | 2025.06.17 |