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 배열을 만들 때, 매년 윤년인지 체크하고 월별 날짜 수를 계산하여야 한다는 점을 잊어버렸던 점 때문에 푸는데 오랜 시간이 걸렸다.
'코딩연습' 카테고리의 다른 글
[백준 알고리즘] Node.js 1331. 나이트 투어 (0) | 2023.03.28 |
---|---|
[백준 알고리즘] Node.js 1312. 소수 (0) | 2023.03.27 |
[백준 알고리즘] Node.js 1834. 나머지와 몫이 같은 수 (0) | 2023.03.21 |
[백준 알고리즘] Node.js 1813. 논리학 교수 (0) | 2023.03.20 |
[백준 알고리즘] Node.js 1551. 수열의 변화 (0) | 2023.03.20 |