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) {
const day = new Date(2016,a-1,b);
const weekday = {
0 : "SUN",
1 : "MON",
2 : "TUE",
3 : "WED",
4 : "THU",
5 : "FRI",
6 : "SAT",
};
return weekday[day.getDay()];
}
일단 a, b를 받아 날짜 형식으로 바꾸어 주었다. ,
로 날짜를 구분해 줄 수는 있다. 주의할 점은 월은 0부터 시작하므로(1월이 0) 월의 숫자인 a에서 1을 빼줘야 한다는 점이다.
그리고 객체에 각각 값을 할당해 주었다. 숫자가 0이면 "SUN"이런 식으로 할당한 다음, getDay()로 0-6의 숫자를 받아 객체 값에 []
로 접근하였다.
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];
}
이 풀이를 보니 아차 싶었다. 숫자로 할당해 주지 않아도 원래 인덱스가 0부터 시작하므로 굳이 할당해주지 않아도 문자에 접근할 수 있기 때문이다. 그리고 날짜도 yyyy-mm-dd형식으로 접근해 주었다. 나는 저렇게 접근했을 때 계속 오류가 떠서 의문이었는데, a, b가 문자 형식이라 제대로 값을 인식하지 못한 듯 하다.
function getDayName(a,b){
var date = new Date(2016, (a - 1), b);
return date.toString().slice(0, 3).toUpperCase();
}
굳이 영어 배열이나 객체를 만들어 주지 않아도, 그냥 date자체에서 값을 얻을 수 있었다.date는 원래 아래와 같이 인출이 된다.
var date = new Date(2016, 4, 24);
console.log(date);
// Tue May 24 2016 00:00:00 GMT+0900 (한국 표준시)
인출된 값에서 알 수 있듯이 요일이 맨 앞에 나타난다. 그러므로 문자로 만든 뒤, 잘라서 대문자로 만들기만 하면 된다. 속도는 다소 느리다고 한다.
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];
}
date()
함수를 쓰지 않은 풀이이다. 달의 날짜수와 요일을 배열로 나타낸 다음, 일수를 센다. 7로 나눴을 때 같은 요일은 같은 나머지를 가진다는 사실을 이용해서 풀어 줬다.