문제
https://school.programmers.co.kr/learn/courses/30/lessons/150370
풀이
해당 문제는 파기해야 할 계약들을 리스트에 담아서 반환해 주는 문제이다.
일단 날짜, 시간 관련 문제를 풀 때는 항상 제일 낮은 수치인 "일"이나 "초"를 기준으로 변환하여 문제를 풀이하면 쉽게 풀 수 있다. 문제를 읽어 보면 중요한 문장이 하나 있는데 이는 다음과 같다.
예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
즉 조건을 잘 읽어보면, 오늘날을 일로 표현한 값과, 개인정보 수집 일자 + 약관의 값이 서로 같으면 개인정보를 파기하여야 한다는 의미이다.
이를 토대로 코드를 작성하면 다음과 같다.
from typing import List, Dict
def solution(today: str, terms: List[str], privacies: List[str]) -> List[int]:
"""
🖥️ 풀이 방법
1. 모든 달은 28일이므로 년, 월, 일 모두 일수로 합쳐 계산한다. 모든 일자를 일수로
표현하기 위해서 sum_days() 함수 만들어 활용한다.
2. cases에 여러 계약일을 사전형태로 담는다.
3. cases을 순회하면서 오늘날과 계약일자 + 개인 정보 수집 기간을 비교한 값을 answer에 담는다.
"""
def sum_days(day: str) -> int:
year, month, day = day.split(".")
return int(year) * 12 * 28 + int(month) * 28 + int(day)
cases: Dict[str, int] = dict()
today: int = sum_days(today)
answer: List[int] = []
for string in terms:
case, term = string.split(" ")
cases[case] = int(term) * 28
for num, string in zip(range(1, len(privacies) + 1), privacies):
day, terms = string.split(" ")
if today >= sum_days(day) + cases[terms]:
answer.append(num)
return answer
이 문제의 포인트는 정리하면 다음과 같다.
- 날짜, 시간 관련한 문제는 최소 단위로 쪼갠 뒤 계산하면 편리하다.
- 오늘날과 계약일자 + 개인 정보 수집 기간이 서로 같을 때 개인 정보를 파기하여야 하는지의 유무를 체크하여야 한다.
'Algorithm > Programmers' 카테고리의 다른 글
프로그래머스 LV1 게임 맵 최단 거리 (0) | 2023.05.25 |
---|---|
프로그래머스 LV1 폰켓몬 (0) | 2023.05.25 |
프로그래머스 LV1 햄버거 만들기 (0) | 2023.05.19 |
프로그래머스 LV1 크레인 인형 뽑기 게임 (0) | 2023.05.19 |
프로그래머스 LV1 달리기 경주 (0) | 2023.05.19 |