CS-STUDY/자료구조 & 알고리즘

시뮬레이션 : 시간/날짜

HwangJerry 2023. 7. 5. 15:32

1. 시간

만약 "2시 5분 ~ 4시 1분"의 경과 시간(elapsedTime)을 측정하고자 한다면, 가장 단순하게는 다음과 같이 시뮬레이션 코드를 작성할 수 있다.

public class Main {
    public static void main(String[] args) {
        int hour = 2, mins = 5;
        int elapsedTime = 0;

        while(true) {
            if(hour == 4 && mins == 1)
                break;
            
            elapsedTime++;
            mins++;

            if(mins == 60) {
                hour++;
                mins = 0;
            }
        }
        
        System.out.print(elapsedTime);
    }
}

 

하지만 위 방식은 비효율적이며, 위와 같이 단순히 특정 두 시점간의 경과 시각을 알고 싶다면 0시0분을 기준으로 누적합을 이용하는 방식을 적용하면 더욱 간단해진다. 다음은 두 시점 h1 : m1 과 h2 : m2 간의 경과 시각을 알아내는 간단한 로직이다.

int elapsedTime1 = h1*60 + m1;
int elapsedTime2 = h2*60 + m2;
int ans = elapsedTime2 - elapsedTime1;
System.out.println(ans);

 

2. 날짜

날짜도 마찬가지이다. 2월 5일부터 4월 1일까지 며칠이 흘러야 하는지 알아보기 위해서는 다음과 같이 시뮬레이션 코드를 작성해볼 수 있다. 이 때, 날짜의 경우 각 월마다 며칠인지 미리 배열로 할당해두면 편하다.

 

public class Main {
    public static void main(String[] args) {
        int month = 2, day = 5;
        int elapsedDays = 0;

        //                                1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12.
        int[] num_of_days = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        while(true) {
            if(month == 4 && day == 1)
                break;
        
            elapsedDays++;
            day++;
        
            if(day > num_of_days[month]) {
                month++;
                day = 1;
            }
        }
        
        System.out.print(elapsedDays);
    }
}

 

하지만 이 또한 누적합을 이용하는 방식을 사용한다면 더욱 쉽고 빠르게 답을 도출해낼 수 있다.

int[] daysOfMonths = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int elapsedDate1 = 0;
for (int i = 0; i < m1; i++) elapsedDate1 += daysOfMonths[i]; // 지난달까지 누적 월 만큼 일수 더하기
elapsedDate1 += d1; // 이번달 일수 더하기

int elapsedDate2 = 0;
for (int i = 0; i < m2; i++) elapsedDate2 += daysOfMonths[i]; // 지난달까지 누적 월 만큼 일수 더하기
elapsedDate2 += d2; // 이번달 일수 더하기

int ans = elapsedDate2 - elapsedDate1 + 1; // 두 날을 모두 포함하는 개념이므로 '차' + 1
System.out.println(ans);

위 과정은 위의 시간처럼 누적합을 사용한 개념이다.