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 메서드
메서드 | 설명 |
---|---|
| 해당 날짜 객체 생성 |
| 비교 대상 날짜보다 이전이면 true 반환 |
| 비교 대상 날짜보다 이후면 true 반환 |
| 두 날짜가 같은지 비교 |
오답
나는 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;
}
}
}
처음에는 연도, 월, 일을 각각 따로 비교해서 정확성 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;
}
}
}