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" |
먼저 요일 배열 days
를 만들었고, 1월 1일이 금요일이라 했으므로,
days[1] = "FRI"
로 맞추기 위해 목요일부터 시작하도록 했다.
그리고 월별 마지막일을 모아둔 배열 months
를 만들었고,
months[1] = 31
로 인덱스를 맞추기 위해 0번째 값은 null을 할당해주었다.
현재 월을 나타내는 month
변수를 선언해 1을 할당했다.
현재 월(month
)가 a
보다 작을 동안 아래의 반복문을 반복한다.
1월 31일
)의 요일("SUN"
)을 구한다.MON
"이 되도록 days
배열을 재정렬해준다.5월
)이 되면 반복문에 들어가지 않고, days
배열을 이용해 26일
에 해당하는 요일을 반환한다.function solution(a, b) {
let days = ['THU', 'FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED'];
const months = [null, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let month = 1;
while(month < a) {
const idx = months[month] % 7;
days = [...days.slice(idx), ...days.slice(0, idx)];
month++;
}
return days[b % 7];
}
Date 생성자 함수로 푼 풀이, slice로 요일 부분만 잘라서 반환했다.
새롭게 배운 사실은 두 번째 매개변수로 월이 아니라 월 index를 줘야 한다는거..
function getDayName(a,b){
var tempDate = new Date(2016, a-1, b); // Tue May 24 2016 00:00:00 GMT+0900 (한국 표준시)
return tempDate.toString().slice(0,3).toUpperCase();
}
a가 2보다 작다면, daySum
은 b - 1
이다. (index로 접근해야 하므로 -1)
daySum
을 7로 나누어 요일리스트에서 해당 인덱스에 있는 요일을 반환한다.dayList[23 % 7]
= "SUN"
a가 2보다 크거나 같다면,
daySum
은 월별 마지막일을 모아둔 배열을 0부터 해당 월 앞까지 자른다.a = 5, b = 24
라면, daySum = [31, 29, 31, 30]
daySum = 121
b - 1
을 더해준다. (마찬가지로 index로 접근해야 하므로 -1)121 + 24 - 1
= 144
daySum
을 7로 나누어 요일 리스트에서 해당 인덱스에 있는 요일을 반환한다.144 % 7
= 4 ("TUE")
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 객체에 템플릿 리터럴을 사용해서 날짜를 전달하고 getDay()
메소드를 사용했다.
getDay()
메소드는 일요일을 0, 토요일을 6 이렇게 index로 리턴하기 때문에 요일을 저장한 배열을 이용해서 문자열을 리턴해줬다.
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];
}
오늘의 교훈 : 날짜 관련 알고리즘 문제를 풀 때는
Date
객체와 메소드를 활용하자..🙂
너무 어려운거같아요 ,, ㅠㅠㅠ