JavaScript/알고리즘

프로그래머스 날짜 비교하기 JS ( if문 / new Date() / 뺄셈 )

hihiha2 2023. 7. 7. 18:01

문제 설명

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

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

 

 

 

🙋‍♀️ 내 생각

 date1의 연도와 date2의 연도를 비교한 뒤, 달을 비교하고, 날짜를 순차적으로 비교하여 0또는 1을 반환하도록 만들었다.

 

이를 위한 적당한 메서드는 생각이 나지 않아서, if문을 통해서 일일이 경우를 나눠서 코드를 만들었다.

우선 연도가 data1의 연도가 date2의 연도보다 작은경우와 아닌경우를 가장 크게 나누고, 또 그 안에서도 만약 연도가 같다면 date1의 달이 date2의 달보다 작은경우와 아닌경우.. 이런식으로 각각의 경우를 모두 나누었다.

 

가독성을 위하여 date1,date2에 각각에 들어있는 값들을 배열의 구조분해를 통해서 year1, month1, day1과 같은 변수에 담아주었다.

 

 

 

✅ 내 코드

function solution(date1, date2) {
  const [year1, month1, day1] = [...date1];
  const [year2, month2, day2] = [...date2];

  if (year1 < year2) {
    return 1;
  } else if (year1 === year2) {
    if (month1 < month2) {
      return 1;
    } else if (month1 === month2) {
      if (day1 < day2) {
        return 1;
      } else {
        return 0;
      }
    } else {
      return 0;
    }
  } else {
    return 0;
  }
}

우선 배열의 구조분해를 통해 date1과 date2에 들어있는 값들을 풀어서 year1, month1, day1과 같은 변수에 담았다.

(가독성을 위해)

 

그런 다음, if문을 통해서 분기처리를 한다. 

date1의 값이 date2의 값보다 작은경우가 date1이 더 날짜가 이른것이므로 1을 반환하고, 그렇지 않은 경우는 0을 반환할 것이다.

여기서 변수는 값이 같은 경우이다. 따라서 큰 경우는 위와 같이 짜고, 값이 같은 경우에만 경우를 더 나눠서 짠다.

 

1. 연도비교

우선 year1 < year2를 비교한다. (그렇지 않은경우는 0을 리턴)

만일 year1이 더 작으면 1을 리턴한다.

(month와 day는 볼 필요도 없다.)

 

2. 만약 연도가 같다면?  ➡️ 월을 비교

month < month2를 비교한다. (else는 0을 리턴)

만약 month1이 작으면 1을 리턴

 

2. 만약 월이 같다면 ➡️ 날 비교

day1 < day2를 비교한다.  (else는 0을 리턴)

만약 day1이 작으면 1을 리천

 

day1까지 같은경우는 어차피 date1이 더 빠른 경우가 아니므로 따로 처리할 필요없이 else로 포함되어 0을 리턴한다.

 

 

 

 

일일이 경우를 나눠서 풀었는데, new Date()메서드를 사용하거나, 뺄셈을 이용해서 푼 방법이 더 간단해서 공부해보았다.

 

 

 

💻  다른사람 코드중에 배울 것 1

const solution = (date1, date2) => new Date(date1) < new Date(date2) ? 1 : 0

new Date()를 통해서 Date객체를 생성한다. 

생성한 객체를 통해서 두 개의 객체를 console.log를 통해서 값을 확인하면 아래와 같이 나온다.

 

 

 

💻 학습한 것

new Date(): 날짜와 시간을 나타내는 객체인 Date 객체를 생성하는 데 사용되는 내장 생성자

  • 호출할 때 인자를 전달하지 않으면 현재의 날짜와 시간에 해당하는 Date 객체가 생성

const currentDate = new Date();와 같이 사용하면 현재 날짜와 시간 정보가 currentDate 변수에 저장

  • new Date(dateString) 형식: 날짜와 시간 정보를 나타내는 문자열(dateString)을 전달하여 해당하는 Date 객체가 생성
  • new Date(year, month, day, hour, minute, second, millisecond) 형식: 연도(year), 월(month), 일(day), 시간(hour), 분(minute), 초(second), 밀리초(millisecond) 값을 전달하여 해당하는 Date 객체가 생성됩니다. 각각의 매개변수는 정수값으로 전달되며, 연도는 1900을 기준으로 상대적인 값으로 해석

 

new Date()를 통해서 생성된 date객체를 <를 통해서 비교한다. 만약 date1의 값이 작으면 1을 리턴하고, 아니라면 0을 리턴한다.

 

 

 

💻  다른사람 코드중에 배울 것  2

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

join('')을 통해서 배열을 하나의 string으로 만든다. 

 

date1.join('')을 하고 결괏값을 확인해보면, 아래와 같이 나온다.

 

이렇게 만든 date1 -  date2 < 0 을 통해서 date가 더 큰지를 비교한다. 

( 자바스크립트는 문자열에서 - 연산자를 사용하면 피연산자를 숫자로 강제변환한다. ➡️ date1.join('') - date2.join('')은 문자열을 숫자로 변환한 후 뺄셈연산을 수행한다.)

 

그래서 만약 그 값이 0보다 작으면 1을 반환하고, 그렇지 않으면 0을 반환한다.

 

 

 

 

🙋‍♀️ 내 생각

두개의 날짜를 비교만 하면 되는 문제라서 까다롭거나 어려운 문제는 아니었지만, new Date()를 알아두면 좋을 것 같아서 기록해둔다.

new Date()를 통해서 만들어진 값도 < 를 통해서 비교가 가능한 점과, 문자열 - 문자열이어도 자바스크립트는 알아서 숫자로 변환하여 연산을 진행한다는 것을 알게 되었다. 

또 new Date()는 들어가는 인자에 따라서 다른 값을 생성하기 때문에 활용하는 방법이 여러가지이고, 아무 값도 넣지 않으면 현재의 날짜와 시간이 생성된다. 실제로 프로젝트를 통해서 무언가를 만드는 기능을 할때는 아마 현재시간을 화면에 띄우는 작업을 new Date()를 통해서 많이 만들지 않을까 생각이 들었다.

 

프로그래머스에서 채점하는 기준을 잘 모르겠지만, if문을 통해서 풀어서 특별한 코드는 아니었다고 생각했는데 그래도 점수를 높게 받아서 뿌듯했다 ㅋㅋ 예전에는 if문에서 어느지점에서 어떻게 분기처리를 해야할지가 너무 헷갈렸던게 기억난다. 실력이 는것 같거나 그런게 눈에 보이지는 않아서 잘 모르겠는데 그래서 이번 문제를 풀면서 분기처리하는게 어렵지 않게 느껴졌다. 실제로 어려운 문제도 아니지만 그래도 나름 전보다는 그래도 발전하고 있구나라는 생각이 들었다. 한번에 눈에 보이게 뭔가 이루는것은 어렵겠지만 한스텝씩 계속 꾸준히만 해나가야겠다고 생각했다. 화이팅 🔥