[프로그래머스] 2016년

2022. 11. 2. 21:07기록/Programmers

    목차

문제 설명

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 = '';
    
    const dayArr = ['THU', 'FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED'];
    const monArr = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    let count = 0;
    for (let i = 0; i < a; i++) {
        count += monArr[i];
    }
    count += b;
    
    answer = dayArr[count % 7];
    return answer;
}
  • 1월 1일이 금요일이다.
  • 요일 배열의 1번째 인덱스에 금요일이 올 수 있도록 배열을 만든다.
  • 달마다의 일수가 들어있는 배열을 만든다.
    • 윤년이므로 2월은 29일이 있다.
    • 0번째 인덱스의 요소로 0을 넣어준다.
      • 예) 1월 24일인 경우 0일 + 24일을 계산하기 위해
      • 예) 2월 24일인 경우 31일 + 24일을 계산하기 위해
  • 주어진 월 이전까지의 일 수를 누적하여 계산한다.
  • 주어진 일 수를 더해준다.
  • 요일 배열에서 계산한 일 수를 7로 나눈 나머지의 인덱스에 있는 요소를 찾아 리턴한다.
    • 일주일은 7개의 요일을 가진다.
    • 어떠한 수를 7로 나머지 연산 하더라도 7보다 작은 수가 나온다.
    • 나머지인 0~6 을 사용하여 배열에서 요일 요소를 찾을 수 있다.

다른 사람의 문제 풀이

function getDayName(a, b) {
  var date = new Date(2016, (a - 1), b);
  return date.toString().slice(0, 3).toUpperCase();
}
function getDayName(a,b){
  var arr = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
  var date = new Date(`2016-${a}-${b}`);
  var day = date.getDay();
  return arr[day];
}
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];
}