Skip to main content

45. [Java] 날짜 비교하기

https://school.programmers.co.kr/learn/courses/30/lessons/181838

  • 정수 배열 date1과 date2가 주어진다.
  • 두 배열은 각각 날짜를 나타내며 [year, month, day] 꼴로 주어진다.
  • 각 배열에서 year는 연도를, month는 월을, day는 날짜를 나타낸다.
    → 약 date1이 date2보다 앞서는 날짜라면 return 1
    → 아니면 return 0

  • date1의 길이 = date2의 길이 = 3
    • 0 ≤ year ≤ 10,000
    • 1 ≤ month ≤ 12
    • day는 month에 따라 가능한 날짜로 주어진다.

정답코드

이건 자바의 LocalDate 메서드를 쓰면 쉽게 해결 가능하다.

import java.time.LocalDate;

class Solution {
    public int solution(int[] date1, int[] date2) {
        LocalDate d1 = LocalDate.of(date1[0], date1[1], date1[2]); // 연, 월, 일
        LocalDate d2 = LocalDate.of(date2[0], date2[1], date2[2]);

        return d1.isBefore(d2) ? 1 : 0; // d1이 d2보다 이전이면 1, 아니면 0
    }
}

자주 쓰이는 LocalDate 메서드

메서드

설명

LocalDate.of(년, 월, 일)

해당 날짜 객체 생성

isBefore()

비교 대상 날짜보다 이전이면 true 반환

isAfter()

비교 대상 날짜보다 이후면 true 반환

equals()

두 날짜가 같은지 비교


오답

나는 LocalDate 메서드를 잘 몰라서 조건문으로 풀이했다.

class Solution {
    public int solution(int[] date1, int[] date2) {
        if (date1[0] < date2[0] || date1[1] < date2[1] || date1[2] < date2[2]) {
            return 1;
        } else {
            return 0;
        }
    }
}

image.png

처음에는 연도, 월, 일을 각각 따로 비교해서 정확성 73.3으로 통과하지 못했다. 이 코드가 부정확한 이유는 다음과 같다.

예를 들면:

int[] date1 = {2024, 12, 31};
int[] date2 = {2025, 1, 1};
  • 현재 코드는:
    • date1[0] < date2[0]true (2024 < 2025)
    • 바로 1 리턴 (정답)

하지만 다음은?

int[] date1 = {2024, 12, 31};
int[] date2 = {2024, 1, 1};
  • date1[0] == date2[0]false
  • date1[1] > date2[1]true (12 > 1)
  • 1 리턴 (정답 아님 ❌)

연도 → 월 → 일을 아래와 같이 순차적으로 조건문 중첩으로 비교하는 코드로 수정했다.

class Solution {
    public int solution(int[] date1, int[] date2) {
        // date1의 연도가 date2보다 작으면 date1이 더 이전 날짜
        if (date1[0] < date2[0]) {
            return 1;
        }
        // 연도가 같고, date1의 월이 date2보다 작으면 date1이 더 이전 날짜
        else if (date1[0] == date2[0] && date1[1] < date2[1]) {
            return 1;
        }
        // 연도와 월이 같고, date1의 일이 date2보다 작으면 date1이 더 이전 날짜
        else if (date1[0] == date2[0] && date1[1] == date2[1] && date1[2] < date2[2]) {
            return 1;
        }
        // 그 외에는 date1이 date2보다 같거나 늦은 날짜
        else {
            return 0;
        }
    }
}