문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/150370
소스 코드
def solution(today, terms, privacies):
terms_dict = {}
# 알파벳이 의미하는 기간을 dict 형태로 재가공
for term in terms:
alphabet, month = term.split()
terms_dict[alphabet] = int(month)
y,m,d = today.split('.') # 년,월,일
today = int(str(y)+str(m)+str(d)) # 비교를 위해 int로 변환
answer = []
for idx in range(len(privacies)): # 각 약관마다
privacy,alpha = privacies[idx].split() # 날짜, term
year,month,day = map(int,privacy.split('.')) # 년,월,일
month += terms_dict[alpha] # 알파벳에 맞게 월 증가
if month % 12 == 0: # 12배수인 경우
year += (month // 12) - 1
month = 12
else: # 12배수가 아닌 경우
year += month // 12
month = month % 12
# int로 바꾸면서 한 자릿수가 된 month,day 조정
year,month,day = str(year),str(month),str(day)
if len(month) == 1:
month = '0' + month
if len(day) == 1:
day = '0' + day
# 오늘 날짜가 약관일 이상인(지난) 경우
if today >= int(year + month + day):
answer.append(idx+1)
return answer
해설
- 단순 구현 문제
- terms, privacies의 길이가 짧기 때문에 시간 복잡도를 크게 고려하지 않아도 되는 문항
- 자료형 변환 시 발생할 수 있는 오류를 캐치
이 문제를 풀기 위해선 크게 두 가지를 고민해야 합니다.
1. 유효기간이 만료되었는지를 today와 어떻게 비교해야 하는가
2. 유효기간을 어떻게 구할 것인가.
1번은 아주 간단히 날짜를 숫자로 바꾸어 비교할 수 있습니다.
유효기간이 예를 들어 2023.02.14라고 하겠습니다.
그렇다면 2023.02.15부터 모든 날짜는 전부 유효기간을 벗어난 것인데, 이때 유효기간을 벗어난 날짜들은 8자리 숫자를 기준으로 유효기간보다 반드시 큽니다.
따라서 today가 유효기간이 끝나는 날보다 크거나 같으면 count 해주면 됩니다.
코드상으로는 다음과 같습니다.
if today >= int(year + month + day):
answer.append(idx+1)
다음으로, 유효기간을 구하기 위해서는 우선 terms를 이용하여 dictionary를 만듭니다.
예를 들어 알파벳이 'A'일 때 3개월을 뜻한다면 {A:3} 으로 만들고, 알파벳을 key로 사용하여 몇 개월에 해당하는지를 알 수 있도록 하는 것입니다.
이제 privacies에 해당하는 각 원소를 꺼내어 날짜와 알파벳으로 구분하고, 알파벳에 해당하는 값을 dictionary에서 찾아와 month에 더해줍니다.
for idx in range(len(privacies)): # 각 약관마다
privacy,alpha = privacies[idx].split() # 날짜, term
year,month,day = map(int,privacy.split('.')) # 년,월,일
month += terms_dict[alpha] # 알파벳에 맞게 월 증가
다음은 month와 year에 대한 후처리 과정입니다.
사실 약관에 의해 달라지는 것은 month 뿐인데 약관에 의해 더해진 값이 12를 초과하게 된다면 year를 증가시켜야 합니다.
1년은 12개월로 구성되어 있기 때문에 12로 나눠주면 되는데, 12월의 경우 12로 나누게 되면 나머지가 0이 되면서 문제가 발생합니다.
예를 들어 기존이 2022.06.14였고 약관 6개월에 의해 2022.12.14가 된 경우는 그대로 유지되어야 하고, 약관 7개월에 의해 2022.13.14가 된 경우는 13을 12로 나눈 몫을 year에 더해주고 나머지를 month로 취해 2023.01.14가 되어야 합니다.
따라서 기존의 month에 약관에 맞는 개월을 더해준 값이 12로 나누어 떨어지는지 아닌지로 구분하여 month와 year를 설정해줍니다.
if month % 12 == 0: # 12배수인 경우
year += (month // 12) - 1
month = 12
else: # 12배수가 아닌 경우
year += month // 12
month = month % 12
마지막으로 기존의 문자형을 정수형으로 변경하여 계산하는 과정에서 한 자릿수가 된 케이스들이 있다면, 앞에 0을 붙여서 다시 두 자리 숫자로 바꿔주도록 합니다.
# int로 바꾸면서 한 자릿수가 된 month,day 조정
year,month,day = str(year),str(month),str(day)
if len(month) == 1:
month = '0' + month
if len(day) == 1:
day = '0' + day
이 과정이 끝나면 1번에 설정한 조건으로 비교하여 정답 리스트에 추가해주도록 합니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 옹알이 (2)(Python) (0) | 2023.02.14 |
---|---|
[프로그래머스] 콜라 문제(Python) (0) | 2023.02.14 |
[프로그래머스] 숫자 짝꿍(Python) (0) | 2023.02.13 |
[프로그래머스] 삼총사(Python) (0) | 2023.02.13 |
[프로그래머스] [3차] 압축(Python) (0) | 2022.10.05 |