오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
from collections import defaultdict
def solution(today, terms, privacies):
terms_table = defaultdict(list)
for term in terms:
a, b = term.split(' ')
terms_table[a] = b
answer = []
year, month, day = map(int, today.split('.'))
for i in range(0, len(privacies)):
a, b = privacies[i].split(' ')
yy, mm, dd = map(int, a.split('.'))
duration = (year - yy)*12*28 + (month-mm)*28 + day - dd
if duration >= (int(terms_table[b]) * 28):
answer.append(i + 1)
return answer
이 코드의 공간복잡도는 크게 영향을 받지 않습니다. 공간복잡도는 대부분 입력 크기와 관련이 있습니다. 여기서는 주어진 데이터에 따라 defaultdict를 사용하여 우리가 필요한 정보를 저장하므로 공간복잡도는 O(N)입니다. N은 우리가 보유한 용어의 수입니다.
그러나 시간복잡도 측면에서는 조금 더 주목해야 할 부분이 있습니다. 주어진 privacies에 대해 반복문을 실행하고, 각 privacies에 대해 split을 수행하여 연산을 수행하므로 시간복잡도는 O(M)입니다. 여기서 M은 privacies의 수입니다.
따라서 코드가 길어지더라도 함수로 분리하면 코드를 이해하기 쉬워지고, 버그를 찾고 수정하기도 편리하다.
일반적으로 파이썬에서 사용한 만큼의 메모리만 할당됩니다. defaultdict를 사용하는 경우, 실제로 사용된 키와 값만 메모리에 할당됩니다. 빈 부분은 메모리에 할당되지 않습니다.
예를 들어, defaultdict를 사용하여 특정 키에 대한 초기값을 설정한 경우, 해당 키에 대한 값이 사용되지 않는 한 메모리에 할당되지 않습니다. defaultdict는 키가 존재하지 않을 때만 초기값을 사용하여 새로운 값을 생성합니다.
따라서 사용하지 않은 부분은 메모리에 할당되지 않으며, defaultdict는 실제로 사용된 키와 값만을 메모리에 저장합니다. 이는 메모리를 효율적으로 사용하는 데 도움이 됩니다.
빈 부분에 대해서는 defaultdict의 기본값이 사용되지 않으며, 해당 부분은 None 또는 기본값으로 설정한 값으로 인식될 수 있습니다. 이에 대한 처리는 일반적으로 defaultdict의 사용 목적과 관련이 있으며, 사용하는 곳에 따라 다를 수 있습니다.
연산 부분을 따로 함수로 빼서 코드의 가독성을 향상시킬 수 있습니다. 이를 위해 연산 부분을 별도의 함수로 정의하고, 이 함수를 solution 함수 내에서 호출할 수 있습니다.
from collections import defaultdict
def calculate_duration(today, privacy):
year, month, day = map(int, today.split('.'))
a, b = privacy.split(' ')
yy, mm, dd = map(int, a.split('.'))
return (year - yy) * 12 * 28 + (month - mm) * 28 + day - dd
def solution(today, terms, privacies):
terms_table = defaultdict(int) # 디폴트값을 0으로 설정
for term in terms:
a, b = term.split(' ')
terms_table[a] = int(b) # 정수로 변환하여 저장
answer = []
for i, privacy in enumerate(privacies):
duration = calculate_duration(today, privacy)
if duration >= (terms_table[b] * 28):
answer.append(i + 1)
return answer
이제 위의 코드에서 개선된 점을 살펴보겠습니다:
calculate_duration 함수 추가: 연산 부분을 별도의 함수로 분리하여 가독성을 향상시켰습니다. 이 함수는 두 날짜 간의 차이를 계산하여 반환합니다.
defaultdict를 정수형으로 변경: terms_table을 defaultdict(int)로 초기화했습니다. 이렇게 하면 초기값이 0이 되므로 나중에 코드에서 형 변환을 하지 않고도 정수형으로 사용할 수 있습니다.
enumerate 사용: enumerate 함수를 사용하여 privacies의 인덱스와 값을 동시에 가져오도록 했습니다.
이러한 변경으로 코드의 가독성을 향상시키고, 중복되는 연산을 함수로 추출하여 재사용성을 높였습니다.