from collections import defaultdict
# 1번, 17번
def solution(today, terms, privacies):
terms_dict = defaultdict(int)
for idx, term in enumerate(terms):
key, val = term.split()
terms_dict[key] = int(val)
result = []
for idx, val in enumerate(privacies):
date, term = val.split()
date = list(map(int, date.split('.')))
date[1] += terms_dict[term]
date[0] += (date[1] - 1) // 12
date[1] -= ((date[1] - 1) // 12) * 12
date = '.'.join(map(lambda x: str(x).zfill(2), date))
if date <= today:
result.append(idx+1)
return sorted(result)
if __name__ == '__main__':
cases = [
["2022.12.08", ["A 6"], ["2022.06.08 A"]],
["2021.12.08", ["A 18"], ["2020.06.08 A"]],
]
for c in cases:
print(solution(*c))
term
에서 제시하는 기간을 O(1)
로 호출할 수 있도록 terms_dict
를 만든다. collections
모듈의 defaultdict
를 활용한다. 키가 존재하는지 확인할 필요 없이 바로 추가할 수 있게 해주는 함수이다.privacies
를 순회하며 날짜 계산을 실시한다. 달에 해당하는 date[1]
에 term
으로 호출한 기간을 더해주고, 12를 초과할 경우 연도에 해당하는 date[0]
에 더해준다.(date[1] - 1) // 12
: 13일 경우 date[0]
에 1이 더해져야 하지만 12일 경우 그대로여야 한다.product
의 인덱스 활용from collections import defaultdict
from itertools import product
dates_dict = {
'.'.join(date): idx for idx, date in enumerate(
product(
[str(l) for l in range(2000, 2032)],
[str(m).zfill(2) for m in range(1, 13)],
[str(n).zfill(2) for n in range(1, 29)]
)
)
}
# 10, 12, 15, 18, 20
def solution(today, terms, privacies):
# terms_dict = {'A': 6, 'B': 12, 'C': 3}
terms_dict = defaultdict(int)
for term in terms:
key, val = term.split()
terms_dict[key] = int(val)
privacies_dict = defaultdict(list)
for idx, term in enumerate(privacies):
privacies_dict[term].append(idx+1)
idx_today = dates_dict[today]
answer = []
for prv in set(privacies):
date, term = prv.split()
if dates_dict[date] + 28 * terms_dict[term] <= idx_today:
answer += privacies_dict[prv]
return sorted(answer)
if __name__ == '__main__':
cases = [
["2022.12.08", ["A 6"], ["2022.06.08 A", "2022.06.08 A"]],
["2021.12.08", ["A 18"], ["2020.06.08 A", "2020.06.08 A"]],
]
for c in cases:
print(solution(*c))
itertools
모듈의 product
함수를 활용해, 2000년부터 2022년 12월 + 100개월까지 모든 날짜에 인덱스를 구하고, O(1)
로 접근할 수 있도록 dictionary로 만든다.terms_dict
를 구비하고,privacies
를 순회하며 각 키마다 마련된 리스트에 인덱스+1을 추가한다. 중복된 privacies
값이 있을 수 있으므로 리스트로 여러 인덱스를 가질 수 있게 했다.privacies
의 모든 인덱스를 한번에 추가할 수 있게 했다. 아래 answer += privacies_dict[prv]
에서 구현했다.set(privacies)
를 순회한다. 각 날짜의 인덱스에 terms_dict
에서 요구하는 달 수에 28일을 곱하여 언제까지 보관할 수 있는지에 대한 인덱스를 구한다. 그 값이 today
의 인덱스보다 같거나 작으면, 즉 오늘부로 파기해야 한다면, answer
에 그 케이스에 해당하는 모든 인덱스를 추가하고 정렬하여 반환한다.1, 17번이 틀린다면, 개월 수를 더하고 연도를 계산할 때 달이 0이 되는 경우를 확인해보고 10, 12, 15, 18, 20번이 틀린다면 중복된 값들 처리가 어떻게 되는지 확인해볼 것