Day 26 - Nested Logic

문제 풀이

중첩된 조건문을 만들어보자.

문제 해석

오늘은 약간의 상황설정이 있는 문제이다. 어려운 문제는 아니라 그런지 에디터에 이미 주어진 코드가 없다.

Task

도서관에서 반납기한을 넘겨 반납된 책에 대한 연체료 책정 프로그램을 만들어라. 기준은 다음과 같다.

  • 반납기한 당일 또는 기한을 넘기지 않고 반납된 책에 대해서는 연체료가 책정되지 않는다 (i.e. fine = 0)
  • 같은 달 안에 반납된 책에는 지난 날짜만큼 15의 연체료가 붙는다. (i.e. fine = 15 * 연체일)
  • 같은 달을 넘긴 책에는 기한을 지난 개월 수만큼 500의 연체료가 붙는다. (i.e. fine = 500 * 연체 월)
  • 해를 넘긴 책에 대해서는 고정된 연체료 10000가 붙는다.

Input Format

  • 첫 줄은 실제반납일이 날짜, 월, 연도 순서로 공백으로 구분된 한 줄의 input값으로 입력된다.
  • 두번째 줄은 반납기한이 날짜, 월, 연도 순서로 공백으로 구분되어 입력된다.

문제 풀이

시행착오

  • 너무 단순하게 접근했다가 안 겪어도 될 시행착오를 만난 문제다.
  • 2021년 1월 1일이 반납기한인 경우 2020년 12월 31일 반납 시 연체료가 붙으면 안되는데, 단순히 2021년보다 큰지만 판단하고, 반납월을 비교하는 다음 조건식으로 넘겨 month를 비교하는 실수를 했다.
  • 그랬더니 같은 해 1월에 반납해야하는 것을 12월에 한 걸로 인식해서 5500의 벌금을 때림. 이렇게 하면 국고에는 도움이 되겠지만 소송을 당할 수도 있으므로 주의할 것

코드 작성하기

  • 일단 두 줄의 인풋을 공백 기준으로 잘라 배열하는 split으로 나누어주고, 각 요소를 변수에 할당해준다.
  • 반납기한보다 늦었는지를 판단하되 다음과 같은 순서로 해주었다.
    • 실제반납연도가 반납기한연도보다 큰지(늦었는지) 판단하여, 크다면 10000으로 연체료 책정
    • 실제반납연도가 반납기한연도와 같다면 실제반납월이 반납기한월보다 큰지 판단하고 true인 경우 (기한 넘긴 개월수 * 500)의 연체료 부과
    • 실제반납연도가 반납기한연도와 같은 같은 조건문 안에서 실제반납월이 반납기한월과 같다면 반납일을 비교하여 실제반납일이 반납기한일보다 큰지 판단, 크다면 (기한 넘긴 일수 * 15)의 연체료 부과
  • 이 모든 조건문에 해당하지 않는다면(실제반납연도가 반납기한연도보다 작은 경우, 같은 해 실제반납월이 반납기한월보다 작은 경우, 같은 달 실제반납일이 반납기한일보다 작은 경우) 반납기한보다 늦은게 아니니까 연체료는 0으로 맨 먼저 할당해둔다.
  • 연체료를 출력하는 print 함수로 마무리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
return_day, return_month, return_year = map(int, input().split())
exp_day, exp_month, exp_year = map(int, input().split())

fine = 0

if return_year > exp_year:
fine = 10000
elif return_year == exp_year:
if return_month > exp_month:
fine = 500 * ( return_month - exp_month)
elif return_month == exp_month:
if return_day > exp_day:
fine = 15 * ( return_day - exp_day )

print(fine)

느낀 점

  • 중복되는 조건문을 줄이고자 연체료가 부과되지 않는 건 else로 안하고 그냥 전역변수에 default로 0을 주는 방식으로 나름 머리를 썼는데… 코드가 예쁘게 나온것 같아서 뿌듯하다.