치춘짱베리굿나이스

[백준] 1308 본문

D-Day

문제

캠프에 오게 된 송유진은 캠프가 너무 지루해서 오늘로부터 캠프가 끝날 때 까지 며칠이나 남았는지 알아보고 싶었다. 그런데 캠프는 비상식적으로 길지도 몰라서 (윤년을 포함할지도 모른다) 손으로 하나하나 세기에는 힘들어 보였다.

더욱 정확한 계산을 위해, 유진이는 윤년이 정해지는 기준을 찾아보았고, 그것은 다음과 같았다.

  • 서력기원 연수가 4로 나누어떨어지는 해는 우선 윤년으로 한다. (2004년, 2008년, …)
  • 100으로 나누어떨어지는 해는 평년으로 한다. (2100년, 2200년, …)
  • 400으로 나누어떨어지는 해는 다시 윤년으로 한다. (1600년, 2000년, …)

그런데 캠프가 너무 길 경우, 사춘기인 유진이는 캠프에 무단으로 빠질지도 모른다.

입력

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

출력

오늘부터 D-Day까지 x일이 남았다면, "D-"를 출력하고 그 뒤에 공백 없이 x를 출력한다. 만약 캠프가 천년 이상 지속된다면 (오늘이 y년 m월 d일이고, D-Day가 y+1000년 m월 d일과 같거나 늦다면) 대신 "gg"를 출력한다. 오늘이 2월 29일인 경우는 주어지지 않는다.

풀이

const getDayOfYear = (year, month, day) => {
  const monthDay = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  let d = 0;
  for (let y = 0; y < year; y++) {
    d += 365 + isLeap(y);
  }
  for (let i = 1; i < month; i++) {
    if (i === 2) d += isLeap(year);
    d += monthDay[i];
  }
  return d + day;
};

const isLeap = (year) => {
  if (year % 4 !== 0) return 0;
  if (year % 100 !== 0) return 1;
  if (year % 400 === 0) return 1;
  return 0;
};

const gg = () => {
  let input = require("fs")
    .readFileSync("/dev/stdin")
    .toString()
    .trim()
    .split("\\n")
    .map((n) => n.split(" ").map(Number));
  let today = getDayOfYear(input[0][0], input[0][1], input[0][2]);
  let dday = getDayOfYear(input[1][0], input[1][1], input[1][2]);
  let thousandDay = getDayOfYear(input[0][0] + 1000, input[0][1], input[0][2]);
  if (dday - today >= thousandDay - today) console.log("gg");
  else console.log(`D-${dday - today}`);
};

gg();

반성회

아예 1년 1월 1일부터 오늘까지 (today), 디데이까지 (dday), 천년 후까지 (thousandDay) 총 일 수를 구하고 thoussandDay - today 가 dday - today 보다 작거나 같을 경우 gg친다

'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글

[백준] 10610  (0) 2022.03.10
[백준] 1459  (0) 2022.03.10
[백준] 1016  (0) 2022.03.10
[백준] 1064  (0) 2022.03.10
[백준] 2583  (0) 2022.03.10
Comments