2016년 A월 B일

2016년 A월 B일

2016년 A월 B일

2016년 1월 1일은 금요일입니다. 2016년 A월 B일은 무슨 요일일까요? 두 수 A,B를 입력받아 A월 B일이 무슨 요일인지 출력하는 getDayName 함수를 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각
SUN,MON,TUE,WED,THU,FRI,SAT
를 출력해주면 됩니다. 예를 들어 A=5, B=24가 입력된다면 5월 24일은 화요일이므로 TUE를 반환하면 됩니다.


1. 처음 생각한 로직

  • 월마다 일 수가 다르다.
    a월이 1,3,5,7,10,12 > 31일
    a월이 4,6,8,9,11 > 30일
    a월이 2 > 28일
  • 일별로 요일이 다르다.
    const day = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"]
    7일 day[0]
    6일 day[6]

    전체 일수가 x라면
    x일을 7로 나눈후 나머지값 arr[x%7]
    x의 값은 ?

  • 전체 일수를 배열과 연결하자.
    31일 + 1 = 32 // 배열에서 금요일부터 32번 후의 값
    1월 0
    2월 31일 + b
    3월 31일 + 29일 + b
    4월 31일 + 29일 + 31일 + b
    5월 31일 + 29일 + 31일 + 30일 + b
    6월 31일 + 29일 + 31일 + 30일 + 31일 = 31일 * 3 + 30일 * 2 - 1
    7월 31일 * 3 + 30일 * 3 -1
    8월 31일 * 4 + 30일 * 3 -1
    9월 31일 * 5 + 30일 * 3 -1
    10월 31일 * 5 + 30일 * 4 -1
    11월 31일 * 6 + 30일 * 4 -1
    12월 31일 * 6 + 30일 * 5 -1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function getDayName(a, b) {
let answer = "";
let month = a;
let date = 0;
let inputDate = b;
let week = 0;

const day = ["FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"]
switch (month) {
case 1:
date = 0
break;
case 2:
date = 31
break;
case 3:
date = 31 + 28
break;
case 4:
date = 31 * 2 + 29
break;
case 5:
date = 31 * 2 + 30 * 2 - 1
break;
case 6:
date = 31 * 3 + 30 * 2 - 1
break;
case 7:
date = 31 * 3 + 30 * 3 - 1
break;
case 8:
date = 31 * 4 + 30 * 3 - 1
break;
case 9:
date = 31 * 5 + 30 * 3 - 1
break;
case 10:
date = 31 * 5 + 30 * 4 - 1
break;
case 11:
date = 31 * 6 + 30 * 4 - 1
break;
case 12:
date = 31 * 6 + 30 * 5 - 1
break;
}
date = date + inputDate
return day[date % 7];
}

//아래 코드는 테스트를 위한 코드입니다.
console.log(getDayName(5, 24));

2. case 문이 너무 비효율적이다. > 반복문으로 바꾸자

1
2
3
4
5
6
7
8
9
10
11
12
function getDayName(a, b) {
let answer = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED",];
let month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let sum = 0;

for (let i = 0; i < a - 1; i++) {
sum += month[i];
}
sum += b;

return answer[(sum % 7)];
}

3. Date 메소드를 사용해보자.

메소드 사용

1
2
3
4
5
6
function getDayName(a, b) {
let arr = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
let date = new Date(`2016,${a},${b}`);
let day = date.getDay()
return arr[day];
}

템플릿 리터럴을 사용하지 않으면 값이 이상하게 나온다.

  • 이유

    1
    2
    3
    4
    new Date();
    new Date(value);
    new Date(dateString);
    new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);

    ** dateString*
    날짜를 표현하는 문자열값. 문자열은 parse 메소드에 의해 인식가능한 형식이어야 한다.

    ** year, month, date*
    날짜의 각 부분을 표현하는 정수값. 월(month)부분은 0부터 11까지의 값을 가지며, 0이 1월을, 11이 12월을 가리킨다.

때문에 템플릿 리터럴로 넣게 되면 문자열이 되어서 그대로 파싱하지만, 숫자일 경우 배열의 인덱스값으로 인지하여서 월의 시작숫자가 0이게 된다.
즉, let date = new Date(2016,a-1,b) 이렇게 넣어야 한다.


참고링크

  1. https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date