치춘짱베리굿나이스

[백준] 1340 본문

연도 진행바

문제

문빙이는 새해를 좋아한다. 하지만, 이제 새해는 너무 많이 남았다. 그래도 문빙이는 새해를 기다릴 것이다.

어느 날 문빙이는 잠에서 깨면서 스스로에게 물었다. “잠깐, 새해가 얼마나 남은거지?”

이 문제에 답하기 위해서 문빙이는 간단한 어플리케이션을 만들기로 했다. 연도 진행바라는 것인데, 이번 해가 얼마나 지났는지를 보여주는 것이다.

오늘 날짜가 주어진다. 이번 해가 몇%지났는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 Month DD, YYYY HH:MM과 같이 주어진다. Month는 현재 월이고, YYYY는 현재 연도이다. 숫자 네자리이다. DD, HH, MM은 모두 2자리 숫자이고, 현재 일, 시, 분이다.

Month는 January, February, March, April, May, June, July, August, September, October, November, December 중의 하나이고, 연도는 1800보다 크거나 같고, 2600보다 작거나 같다. 항상 올바른 날짜와 시간만 입력으로 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 $10^{-9}$까지 허용한다.

풀이

const getMonthInt = (monthStr) => {
  switch (monthStr[0]) {
    case "J":
      if (monthStr[1] === "a") return 1;
      else if (monthStr[2] === "n") return 6;
      else if (monthStr[2] === "l") return 7;
    case "F":
      return 2;
    case "M":
      if (monthStr[2] === "r") return 3;
      else if (monthStr[2] === "y") return 5;
    case "A":
      if (monthStr[1] === "p") return 4;
      else if (monthStr[1] === "u") return 8;
    case "S":
      return 9;
    case "O":
      return 10;
    case "N":
      return 11;
    case "D":
      return 12;
  }
};

const ifLeap = (year) => {
  if (!(year % 400) || (!(year % 4) && year % 100)) return true;
  else return false;
};

const countDay = (month, date, year) => {
  const monthArr = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  if (ifLeap(year)) monthArr[2]++;
  let day = 0;
  for (let i = 0; i < month; i++) day += monthArr[i];
  return day + date - 1;
};

const newYear = () => {
  const input = require("fs")
    .readFileSync("/dev/stdin")
    .toString()
    .trim()
    .split(" ");
  const month = getMonthInt(input[0]);
  const day = parseInt(input[1]);
  const year = parseInt(input[2]);
  const [hour, minute] = input[3].split(":").map(Number);
  let yearMin = ifLeap(year) ? 366 * 24 * 60 : 365 * 24 * 60;
  let nowMin = countDay(month, day, year) * 24 * 60 + (hour * 60 + minute);
  console.log((nowMin / yearMin) * 100);
};

newYear();

반성회

  • getMonthInt : 문자열로 된 월을 숫자로 바꾸는 함수 (January1)

  • ifLeap : 윤년인지 판정하는 함수

  • countDay : 1월 1일부터 며칠이 지났는지 판정하는 함수

    이때 day + date - 1을 하는 이유는 1월 1일은 0일차이고, 1월 2일은 1일차이므로

  • 한 해동안의 총 분 (365 * 24 * 60 또는 윤년일 때 366 * 24 * 60) 에서 입력값 시간까지의 총 분을 뺀다

      let nowMin = countDay(month, day, year) * 24 * 60 + (hour * 60 + minute);

    1월 1일부터 지금까지의 일 수 * 24 * 60 + 지금 시간 * 60 + 지금 분

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

[백준] 1780  (0) 2022.03.17
[백준] 2630  (0) 2022.03.17
[백준] 11728  (0) 2022.03.17
[백준] 5338  (0) 2022.03.17
[백준] 1074  (0) 2022.03.17
Comments