[프로그래머스 JS] 2016년

이얀·2021년 10월 25일
0

알고리즘

목록 보기
1/22

문제 설명

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT

입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

제한 조건

2016년은 윤년입니다.
2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

입출력 예

a b result
5 24 "TUE"

내 풀이

function solution(a, b) {
      let answer = "";
      let day = 0;
      const week = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"];
      if (a % 2) {
        if (a == 1) day = b;
        else day = 61 * Math.floor(a / 2) + b;
        if (a > 8) day++;
      } else {
        if (a == 2) day = (a / 2) * 31 + b;
        else day = (61 * a) / 2 - 30 + b;
      }
      if (a > 2) day--;
      answer = week[day % 7];
      return answer;
    }

구현방법

  1. 변수 day : 1월 1일 부터 시작해서 입력받은 월/일이 몇일 후 인지를 구했다.
  2. 1월 1일은 금요일이기 때문에 week 배열에서 1번째 자리에(1을 7로 나누면 나머지가 1) "FRI"를 배치시켰다.
  3. 아래는 day를 구하는 수식이다. (Math.floor(a / 2)을 M으로 작성하겠다.)

홀수 달

1월은 그냥 b,
3월부턴 31 M + 30 M + b => 따라서 61 * M + b

if (a % 2) {
  if (a == 1) day = b;
  else day = 61 * Math.floor(a / 2) + b;
}

짝수 달

2월일 땐 1월만 고려한다.
그 이후부턴 31 a/2 + (30 a/2 - 1) + b => 따라서 61 * a/2 - 30 + b

if (a == 2) day = (a / 2) * 31 + b;
else day = (61 * a) / 2 - 30 + b;

8보다 큰 홀수 달

31 (M + 1) + 30 (M - 1) + b => 따라서 61 * M + 1 + b
즉, 홀수 달 수식에 1만 더해주면 됨

if (a > 8) day++;

다른 사람들과 풀이가 달랐던 점

  1. Date 내장 객체를 사용하지 않았다.
// 제일 깔끔해 보였던 풀이
function getDayName(a,b){
  var date = new Date(2016, (a - 1), b);
  return date.toString().slice(0, 3).toUpperCase();
}
  1. 달마다 일수를 일일이 배열에 넣지 않고 케이스를 나눠서 문제를 풀었다.
// 많은 사람들이 이와 같이 푼 것을 확인할 수 있었다.
var MONTH = [31,29,31,30,31,30,31,31,30,31,30,31];

0개의 댓글