2019년 5월 15일 수요일

Hackerrank Day 26 Nested Logic







알고리즘 연습 사이트


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);
    }
}

Date 객체를 사용할 필요까지도 없고 문제 자체가 년, 월, 일만 비교하는 것이기 때문에 단순 숫자만으로 계산해도 무리가 없다.

댓글 없음:

댓글 쓰기