문제
https://school.programmers.co.kr/learn/courses/30/lessons/150370
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
리뷰
2023 카카오 신입 공채 1차 코딩테스트 문제이다. 레벨 1 문제인만큼 어렵지는 않다.
다만 제출했을 때 몇몇 케이스에서 오답이 나왔는데, 아래 사항을 고려해서 코드를 고쳤더니 해결되었다.
(1) 파기일 계산
모든 달의 일 수가 28일로 같으므로, n개월 후의 날짜는 'n개월 후'를 'n//12
년 n%12
개월 후'로 변환하여 기준 연도와 월에 더해 계산할 수 있다.
예를 들어, 기준일자가 '2024년 2월 28일'일 때 25개월 후, 즉 2년 1개월 후는 '2026년 3월 28일'이 된다.
그런데 기준월에 1개월을 더했는데 정상적인 날짜가 나오지 않는 경우가 있다. 기준일자가 '2024년 12월 28일'이라면 위처럼 단순히 계산하면 '2026년 13월 28일'이 되기 때문이다. 이런 경우를 고려해야 한다.
(2) 개인정보의 번호
원인을 구체적으로 확인해보지는 않았는데, 아래와 같이 index()
메서드를 이용해서 answer
리스트를 구성하면 테스트케이스 10, 15, 18, 20번에서 실패했다.
# 테스트케이스 10, 15, 18, 20에서 실패
for privacy in privacies:
# 유효기간 지났는지 확인
if (유효기간이 지났을 때):
answer.append(privacies.index(privacy)+1)
else:
continue
아래와 같이 answer
리스트를 구성했더니 해당 케이스를 모두 통과했다.
# 테스트케이스를 모두 통과하는 방식
for i in range(len(privacies)):
# 유효기간이 지났는지 확인
if (유효기간이 지났다면):
answer.append(i+1)
else:
continue
풀이
위에서 언급했던 것을 고려하여 파기일을 계산하는 함수 cal_exp
를 구현했다.
또한 오늘 날짜가 파기일 이전인지 비교하는 함수 comp_date
를 구현했다.
코드
import copy
def solution(today, terms, privacies):
answer = []
term_dict = {}
today_date = convert_date_string_to_list(today)
# terms 리스트->딕셔너리로 변환
for term in terms:
temp = term.split()
term_dict[temp[0]] = int(temp[1])
for i in range(len(privacies)):
privacy = privacies[i]
temp = privacy.split()
date = convert_date_string_to_list(temp[0]) # 개인정보 수집일자
term_no = temp[1] # 약관 번호
exp = cal_exp(date, term_dict[term_no])
comp_result = comp_date(today_date, exp)
if (comp_result <= 0):
answer.append(i+1)
else:
continue
return answer
# 파기일을 계산하는 함수
def cal_exp(date, after):
exp = copy.deepcopy(date)
year = date[0]
month = date[1]
exp[0] += after//12
exp[1] += after%12
if (exp[1] > 12):
exp[0]+=1
exp[1]=exp[1]-12
return exp
# 날짜 문자열->리스트 변환하는 함수
def convert_date_string_to_list(date):
date_list = date.split(".")
for i in range(3):
date_list[i] = int(date_list[i])
return date_list
# 리스트 형식의 날짜를 비교하는 함수
def comp_date(today, standard):
for i in range(3):
if today[i] < standard[i]:
return 1
elif today[i] > standard[i]:
return -1
else:
continue
return 0
'Problem Solving' 카테고리의 다른 글
[프로그래머스/Lv.2] 석유 시추 - Python (0) | 2024.03.21 |
---|---|
[프로그래머스/Lv.2] 광물 캐기 - Python (0) | 2024.03.19 |
[프로그래머스/Lv.2] H-Index - Java (0) | 2023.04.28 |
[프로그래머스/Lv.2] 의상 - Java (0) | 2023.04.28 |
[프로그래머스/Lv.0] 옹알이(1) - Java (0) | 2023.04.27 |