The journey to becoming a developer

My future is created by what I do today, not tomorrow.

Algorithms/Programmers

[프로그래머스 Level 1] 2016년 (자바스크립트)

Millie 2021. 10. 19. 05:50

Description

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"를 반환하세요.

Constraints

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

 

My Solution

function solution(a, b) {
  const week = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
  const date = new Date(`2016-${a}-${b}`);
  return week[date.getDay()];
}

나는 Date를 활용하여 문제를 간단하게 해결할 수 있었다. 

  1. Date 생성자 함수에 날짜를 나타내는 문자열을 인수로 전달하여 지정된 날짜와 시간을 나타내는 Date 객체를 반환할 수 있도록 하였다. 
  2. 그렇게 생성된 객체에 getDay() 메서드를 사용하면 요일을 나타내는 정수를 0(일요일)부터 6(토요일)까지 반환한다. 
  3. 그렇게 얻어진 반환값을 week의 인덱스로 활용해서 요일을 구한다.

 

Other's Solutions

function getDayName(a, b) {
  return new Date(2016, a - 1, b).toString().slice(0, 3).toUpperCase();
}

요일은 항상 앞의 세글자라는 점을 이용해 요일이 들어 있는 배열을 만들지 않고 간단하게 풀 수 있는 방법이다. 

 

Date()를 이용하지 않은 풀이들

Date()를 이용하지 않을 경우, 각 월의 일 수가 들어있는 배열과 요일이 들어있는 배열이 필요하다.

function getDayName(a, b) {
  var dayList = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU'];
  var monthArr = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  var daySum;
  if (a < 2) {
    daySum = b - 1;
  } else {
    daySum = monthArr.slice(0, a - 1).reduce((a, b) => a + b) + b - 1;
  }
  return dayList[daySum % 7];
}

 

function getDayName(a, b) {
  var answer = '';
  var MONTH = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  var WEEK = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU'];
  var sum = 0;
  for (var i = 1; i < a; i++) {
    sum += MONTH[i - 1];
  }
  answer = WEEK[(sum + b - 1) % 7];
  return answer;
}