본문으로 바로가기
반응형

이번 글에서는 두 개의 int 배열을 받아서 배열이 나타내는 날짜를 비교하는 방법을 다룹니다. 두 배열은 [year, month, day] 형태로 구성되어 있으며, 첫 번째 배열이 두 번째 배열보다 앞선 날짜일 경우 1을 반환하고, 그렇지 않으면 0을 반환하는 메서드를 작성해보겠습니다.

질문과 예시를 통해 먼저 문제를 정의한 다음, 잘못된 접근 방식과 이를 수정한 올바른 접근 방식을 설명하겠습니다.

질문: 두 날짜 비교하기

Java에서 다음과 같은 두 날짜 배열을 비교하는 메서드를 작성하고자 합니다. 조건은 다음과 같습니다:

  • 배열 arr1이 배열 arr2보다 앞선 날짜라면 1을 반환하고, 그렇지 않으면 0을 반환합니다.
  • 단, if문만을 사용해서 비교해야 합니다.

예시

int[] arr1 = {2023, 11, 28};
int[] arr2 = {2023, 11, 29};
System.out.println(compareDates(arr1, arr2)); // 출력: 1

정답: 두 날짜 배열을 비교하는 코드

public class DateCompare {
    public static int compareDates(int[] arr1, int[] arr2) {
        // 연도 비교
        if (arr1[0] < arr2[0]) {
            return 1;
        } else if (arr1[0] > arr2[0]) {
            return 0;
        }
        
        // 월 비교
        if (arr1[1] < arr2[1]) {
            return 1;
        } else if (arr1[1] > arr2[1]) {
            return 0;
        }
        
        // 일 비교
        if (arr1[2] < arr2[2]) {
            return 1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        int[] date1 = {2023, 10, 31};
        int[] date2 = {2023, 11, 1};

        System.out.println(compareDates(date1, date2)); // 출력: 1
    }
}

위 코드에서는 arr1과 arr2의 연도, 월, 일을 순차적으로 비교합니다.

  1. 연도 비교: arr1[0]이 arr2[0]보다 작으면 arr1이 더 이른 날짜이므로 1을 반환합니다. 크면 0을 반환합니다.
  2. 월 비교: 연도가 같을 때만 월을 비교합니다. arr1[1]이 arr2[1]보다 작으면 1을, 크면 0을 반환합니다.
  3. 일 비교: 연도와 월이 같은 경우, 일자를 비교하여 arr1[2]가 arr2[2]보다 작으면 1, 크거나 같으면 0을 반환합니다.

이 코드에서는 입력된 두 날짜 배열을 순차적으로 비교하며 조건에 맞게 if문만 사용하여 작동합니다.

예외와 잘못된 접근 방식: 독립적인 조건 비교가 왜 틀렸는가?

잘못된 접근 방식은 아래와 같습니다:

if (arr1[0] < arr2[0]) {
    return 1;
} else if (arr1[1] < arr2[1]) {
    return 1;
} else if (arr1[2] < arr2[2]) {
    return 1;
} else {
    return 0;
}

이 방법은 연도 → 월 → 일의 순서를 확인하지 않고 각 조건을 독립적으로 비교합니다. 이 접근 방식의 문제점은 다음과 같습니다:

  1. 순차적 비교가 누락됨: else if 구문을 통해 arr1[1] < arr2[1] 또는 arr1[2] < arr2[2]을 확인하게 되면, 연도나 월이 같지 않아도 일(day) 조건을 비교할 수 있습니다. 예를 들어, 연도가 다르거나 월이 다를 때, 잘못된 결과가 반환될 수 있습니다.
  2. 잘못된 조건 흐름: 연도, 월, 일의 비교는 각각이 독립적이 아니라 순차적으로 연결되어 있어야 합니다. 그렇지 않으면 연도와 월이 같은지를 확인하기 전에 일을 비교할 가능성이 생깁니다.

예외 상황 예시: 잘못된 코드로 인한 오류 발생

예를 들어, 다음과 같은 두 날짜가 있을 때를 살펴보겠습니다:

int[] arr1 = {2023, 10, 31};
int[] arr2 = {2023, 11, 1};

이 경우 arr1은 arr2보다 앞선 날짜이므로 올바른 결과는 1입니다. 그러나 잘못된 코드에서는 arr1[0] == arr2[0] (연도가 같음)을 확인하지 않은 상태에서 arr1[1] < arr2[1] 조건을 독립적으로 비교합니다. 이로 인해 잘못된 조건 흐름이 발생하고, 1을 반환하게 됩니다.


정리

두 날짜 배열을 비교할 때는 날짜 구성 요소인 연도, 월, 일의 순차적 비교가 필요합니다. 이를 위해 각 조건을 중첩하여 비교하면 올바른 결과를 얻을 수 있습니다.

반응형