코딩테스트/프로그래머스 기초 트레이닝

[Javascript] 날짜 비교하기

dev_swH 2023. 6. 23. 16:57

문제 설명 : 

정수 배열 date1과 date2가 주어집니다. 두 배열은 각각 날짜를 나타내며 [year, month, day] 꼴로 주어집니다. 각 배열에서 year는 연도를, month는 월을, day는 날짜를 나타냅니다.

만약 date1이 date2보다 앞서는 날짜라면 1을, 아니면 0을 return 하는 solution 함수를 완성해 주세요.

 

테스트 케이스까지는 통과하는데, 정작 채점을 하면 15문제 중 4문제가 틀렸다.

원인을 끝내 찾아내지 못하고 결국 구글링으로 답을 찾을 수밖에 없었다.

 

처음에 짠 코드 :

function solution(date1, date2) {
    const [year1, month1, day1] = date1;
    const [year2, month2, day2] = date2;
    
    return year1 < year2 ? 1
    : month1 < month2 ? 1
    : day1 < day2 ? 1 : 0;
}

 

제출한 코드 :

function solution(date1, date2) {
    const [year1, month1, day1] = date1;
    const [year2, month2, day2] = date2;
    
    if (year1 !== year2) return year1 < year2 ? 1 : 0;
    if (month1 !== month2) return month1 < month2 ? 1 : 0;
    if (day1 !== day2) return day1 < day2 ? 1 : 0;
    return 0;
}

 

추측하기로는 기존 코드가 동등한 값을 제대로 걸러내지 못하는 게 아닌가 싶다.

채점 케이스에 무슨 값이 들어가는지 볼 수 없어서 확인할 수 없는 게 아쉽다ㅠㅠ...

 

이외에 다른 사람의 코드 중에서 훨씬 간단하고 깔끔한 코드가 있어서 2개 가져온다.

function solution(date1, date2) {
    return date1.join('') - date2.join('') < 0 ? 1 : 0;
}

 

이 코드는 배열을 문자열로 바꾼 다음, 크기를 비교해서 반환값을 내는 방식.

생각도 못했는데 앞으로 잘 기억해둬야겠다.

참고로 문자열 크기 비교는 이 포스트가 예시로 간단하게 잘 정리해뒀길래 첨부.

https://velog.io/@elinapark/%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%81%AC%EA%B8%B0-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0

 

문자열 크기 비교하기

string 타입의 문자 or 숫자 비교하기

velog.io

 

function solution(date1, date2) {
    return new Date(...date1) < new Date(...date2) ? 1 : 0;
}

 

이 코드는 Date 객체를 이용한 방법.

사실 Date 생성자에 매개변수로 배열을 넣는 것은 공식 문서에서 권장하지 않는다.

그래서 배열 형태로 연월일이 제공된다면 이렇게 전개 구문(spread 연산자)를 이용하는 것이 바람직하다.

(원래 알고있던 건 아니고😅 MDN 공식 문서를 읽어보면서 알게 됐다.)

그리고 Date 객체끼리 빼거나 곱하는 등 숫자 계산을 하면, 밀리초로 변환되어 계산된다.

즉 뺄셈을 기준으로 날짜가 같으면 0, 이전 날짜면 음수, 이후 날짜면 양수가 나오게 되는 것이다.

(참고로 더하기는 안 된다. Date 객체는 문자열 자료를 반환하기 때문에 연결 연산자로 인식해버린다.)

공식 문서는 이쪽.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date 

 

Date() constructor - JavaScript | MDN

The Date() constructor creates Date objects. When called as a function, it returns a string representing the current time.

developer.mozilla.org

 

그건 그렇고 오늘 MDN이 이상하다🙄....

무슨 항목을 눌러도 한국어 번역 페이지가 안 뜬다😢

사이트에 오류가 생긴 모양.