https://school.programmers.co.kr/learn/courses/30/lessons/150370
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from datetime import datetime
def solution(today, terms, privacies):
today_year = int(today.split('.')[0])
today_month = int(today.split('.')[1])
today_day = int(today.split('.')[2])
#terms 딕셔너리로 변경
term = {}
result = []
for i in range(len(terms)):
t = terms[i].split()
term[t[0]] = int(t[1])
for i, privacy in enumerate(privacies):
privacy = privacy.split()
kind = privacy[1]
privacy = privacy[0].split('.')
year = int(privacy[0])
month = int(privacy[1])
day = int(privacy[2])
#month 계산
month += term[kind]
while month > 12:
month -= 12
year += 1
#day 계산
day -= 1
if day == 0:
month -= 1
day = 28
if month == 0:
month = 12
year -= 1
if datetime(today_year, today_month, today_day) > datetime(year, month, day):
result.append(i+1)
return result
today_year = int(today.split('.')[0])
today_month = int(today.split('.')[1])
today_day = int(today.split('.')[2])
입력으로 들어오는 today를 datetime 모듈에 입력할 수 있도록 형태를 바꾸어줍니다.
today는 '.'으로 구분되어 있기 때문에 split('.')을 하여 '.'을 기준으로 리스트를 분리시켜주고
각각을 today_year,today_month, today_day에 저장합니다.
today = "2022.05.19" 라면
- today_year : 2022
- today_moth : 05
- today_day : 19
로 저장이됩니다.
#terms 딕셔너리로 변경
term = {}
result = []
for i in range(len(terms)):
t = terms[i].split()
term[t[0]] = int(t[1])
terms를 딕셔너리 형태로 변경해줍니다.
공백을 기준으로 split() 하여 분리시키고 term 딕셔너리에 약관종류(t[0])와 유효기간(t[1])을 입력합니다.
terms = ["A 6", "B 12", "C 3"] 라면
- term[A] : 6
- term[B] : 12
- term[C] : 3
이 됩니다.
for i, privacy in enumerate(privacies):
privacy = privacy.split()
kind = privacy[1]
privacy = privacy[0].split('.')
year = int(privacy[0])
month = int(privacy[1])
day = int(privacy[2])
#month 계산
month += term[kind]
while month > 12:
month -= 12
year += 1
#day 계산
day -= 1
if day == 0:
month -= 1
day = 28
if month == 0:
month = 12
year -= 1
if datetime(today_year, today_month, today_day) > datetime(year, month, day):
result.append(i+1)
for문에 enumerate를 사용하여 privacies를 반복하면서 index와 privacies의 요소를 추출합니다.
먼저 pribacy = "2021.05.02 A" 라면
pribacy를 공백을 기준으로 split합니다.
pribacy = ["2021.05.02", "A"]가 되고 kind = pribacy[1]로 "A"가 저장이 됩니다.
그다음 pribacy를 '.'을 기준으로 split하여 pribacy = ["2021", "05", "02"]가 되고
year : 2021
month : 5
day : 2
로 저장합니다.
주어진 약관종류(kind)에 따른 유효기간(term[kind])을 꺼내어 month에 더해줍니다.
유효기간이 month에 더해졌을때 12보다 큰값이 나와 범위를 초과할 수 있기 때문에
12보다 작아질때까지 month - 12를 해주고 year + 1을 하여 year을 증가시켜줍니다.
day - 1을 해주어 유효기간을 계산해줍니다.
이때 day가 0이라면 day를 28로 바꾸어주고 month - 1을 해줍니다.
그리고 month에서 1을 뺐을때 month가 0이 되면
month를 12로 바꾸어주고 year에서 1을 빼줍니다.
이렇게 계산된 값들을 datetime 모듈을 사용하여 today와 비교하여 유효기간이 지났다면
해당 인덱스(i)에 +1을 하여 result에 저장해줍니다.
리스트의 순서대로 반복을 했기 때문에 result를 정렬할 필요가 없이 자동으로 오름차순이 되어있는 상태입니다.
따라서 그대로 result를 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 부분수열의 합 파이썬(Python) (0) | 2023.01.14 |
---|---|
[코딩테스트] 프로그래머스 테이블 해시 함수 파이썬(Python) (0) | 2023.01.13 |
[코딩테스트] 프로그래머스 [1차] 뉴스 클러스터링 파이썬(Python) (0) | 2023.01.07 |
[코딩테스트] 프로그래머스 메뉴 리뉴얼 파이썬(Python) (0) | 2023.01.05 |
[코딩테스트] 프로그래머스 [3차] 압축 파이썬(Python) (0) | 2023.01.05 |