728x90
반응형
- 문제 링크: 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"))
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 |