알고리즘 연습 사이트
Day 26:Nested Logic
D-Day 문제도 거의 막바지다.
오늘은 도서관 대출 벌금 계산하기이다.
간단하게 설명하면 반납예정년보다 반납년이 늦으면 요금이 $10000$이다. 제때 반납했으면 물론 요금은 0이며, 달이 늦으면 $500 * (반납월-반납예정월)$ 을 계산한다.
마찬가지로 동일한 년월에서 일자만 늦는 경우에는
$15 * (반납일 - 반납예정일)$ 이다.
가독성이 정말 떨어지지만 문제 통과는 하였다.
코드를 작성 할 때마다 느끼는 것이지만 이 고정적인 사고 습관에서 벗어나기란 참 어렵다.
*처음작성코드
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String returnDate = sc.nextLine();
String dueDate = sc.nextLine();
String [] returnDateArr = returnDate.split(" ");
String [] dueDateArr = dueDate.split(" ");
int[] iReturnDateArr =new int[3];
int[] iDueDateArr = new int [3];
for(int i = 0 ; i < returnDateArr.length;i++){
iReturnDateArr[i] = Integer.parseInt(returnDateArr[i]);
}
for(int i = 0 ; i < dueDateArr.length;i++){
iDueDateArr[i] = Integer.parseInt(dueDateArr[i]);
}
int fine = 0;
//0 : day , 1: month , 2 : year
if(iReturnDateArr[2] <= iDueDateArr[2]){ //년비교
if(iReturnDateArr[2] == iDueDateArr[2]){
if(iReturnDateArr[1] <= iDueDateArr[1]){
if(iReturnDateArr[0] <= iDueDateArr[0]){
fine=0;
}else{
fine= 15 * (iReturnDateArr[0] - iDueDateArr[0]);
}
}else{ //반납월이 늦으면
fine = 500 * (iReturnDateArr[1] - iDueDateArr[1]);
}
}else{
fine = 0;
}
}else{ //반납 년도가 더 클 경우
fine = 10000;
}
System.out.println(fine);
}
}
위 코드에서 stdin으로 입력을 받는 부분은 논외로 쳐도, 가장 큰 문제점은 쓸때 없는 if문 구절이 많이 중복되었다.
fine=0을 처리하는 조건들을 반대로 걸어 코드를 더 축약할 수 있다.
*개선버전
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int rDay = sc.nextInt();
int rMonth = sc.nextInt();
int rYear = sc.nextInt();
int eDay = sc.nextInt();
int eMonth = sc.nextInt();
int eYear = sc.nextInt();
int fine=0;
if(rYear < eYear){
fine = 0;
}else{
if(rYear > eYear){
fine = 10000;
}else if(rMonth > eMonth){
fine = 500 * (rMonth-eMonth);
}else if(rDay > eDay){
fine = 15 * (rDay - eDay);
}
}
System.out.println(fine);
}
}
댓글 없음:
댓글 쓰기