[백준 알고리즘] Node.js 1308. D-Day

2023. 3. 23. 15:18코딩연습

1. 문제

https://www.acmicpc.net/problem/1308

 

1308번: D-Day

첫째 줄에 오늘의 날짜가 주어지고, 두 번째 줄에 D-Day인 날의 날짜가 주어진다. 날짜는 연도, 월, 일순으로 주어지며, 공백으로 구분한다. 입력 범위는 1년 1월 1일부터 9999년 12월 31일 까지 이다.

www.acmicpc.net

 

2. 풀이

1) 오늘날짜에 해당하는 모든 날과 D-Day에 해당하는 모든 날을 계산한다.

2) 이 때, 윤년에 해당하는 해의 2월은 "29일" 이 된다.

3) 문제에서 캠프가 천년이상 지속될 경우, gg를 출력하도록 만든다.

const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

const todayArr = inputs.shift().split(' ').map(Number);
const dDayArr =  inputs.shift().split(' ').map(Number);

const calcMonthToDays = (y) => {
    let monthDays = [31,28,31,30,31,30,31,31,30,31,30,31]
    if(y % 4 === 0 && y % 100 !== 0 || y % 400 === 0){
        monthDays[1] = 29;
    }
    
    return monthDays;
}

const calcDays = (y,m,d) => {
    let days = 0;
    let monthToDays;
    for(let i = 1; i < y; i++){
        monthToDays = calcMonthToDays(i);
        for(let j = 0; j < 12; j++){
            days += monthToDays[j];
        }
    }
    
    monthToDays = calcMonthToDays(y);
    for(let i = 0; i < m-1; i++){
        days += monthToDays[i];
    }
    
    days += d;
    
    return days;
}

let tDays = calcDays(todayArr[0], todayArr[1], todayArr[2]);
let dDays = calcDays(dDayArr[0], dDayArr[1], dDayArr[2]);

if(dDays - calcDays(todayArr[0] + 1000, todayArr[1], todayArr[2]) >= 0){
    console.log("gg")
} else {
    console.log(`D-${dDays - tDays}`);
}

- calcMonthToDays() 메서드는 원하는 년도를 넣어 윤년인지 체크하고, 월별 날짜 수를 리턴하는 메서드이다.

- calcDays() 메서드는 연도, 월, 일 을 넣어 1년 1월 1일 부터 해당 날짜까지의 날짜 수를 리턴하는 메서드이다.

- D-day와 입력받은 오늘의 날짜를 계산한 후, 두 값의 차이가 천년 이상인지 확인하고, 천년 이상이라면 "gg", 

  아닐 경우, D-날짜가 나오도록 해준다.

 

3. 정리

- 처음 Date() 함수를 이용하여 계산하려 했으나 윤년에 대한 부분을 추가해야 한다는 글을 찾게 되었다.

- 중간에 monthToDays 배열을 만들 때, 매년 윤년인지 체크하고 월별 날짜 수를 계산하여야 한다는 점을 잊어버렸던 점 때문에 푸는데 오랜 시간이 걸렸다.