[Programmers 알고리즘] [날짜] 2016년 - 특정 요일 구하기

2020. 3. 8. 17:27Algorithm

반응형

문제 설명

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

 


문제 풀이

아주 쉬운 문제임에도 불구하고, 난 좀 오래 걸렸는데

그 이유는 문서를 제대로 안 읽어서... Date 함수를 제대로 쓰지 못했기 때문이다.
(그래서 관련 내용을 이곳에 정리해두었다. 참고 ㅎㅎ)

막혔던 이유?

new Date(년, 월, 일)로 날짜 설정을 했는데, 입력 값이 잘 못 되어서...
예를 들어 2016년 1월 1일로 설정하고 싶으면 아래와 같이 해야한다.

// let date = new Date(16, 1, 1); // 잘못된 예 - 1916-02-01로 지정됨
let date = new Date(2016, 0, 1);
  • 년도 : 천의자리로 입력. 십의 자리로 입력하면 앞에 19가 붙는다.
  • 월 : 0부터 시작 (즉, 1월은 0)
  • 일 : 그대로

코드

1. 출력 값을 활용

Date.toString()의 0~2자리가 요일을 출력한다는 점을 이용

function solution(a, b) {
    let day = new Date(2016, a-1, b); // 날짜 구하기 1
    // let day = new Date(`2016-${a}-${b}`); // 날짜 구하기 2
    return day.toString().slice(0, 3).toUpperCase();
}

2. Date.getDay()를 활용

Date 프로토타입의 요일 값을 리턴하는 함수를 활용한다.
(나라마다 요일의 언어가 다르기 때문에 숫자를 리턴하며, 그 값은 0(일) ~ 6(토)이다.)

function solution(a, b) {
    let day = new Date(2016, a-1, b); // 날짜 구하기 1
    // let day = new Date(`2016-${a}-${b}`); // 날짜 구하기 2
    var weekDay = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
    return weekDay[day.getDay()];
}

 

더보기

3. 무식하게 푼 방법

위의 날짜 이슈 때문에 이렇게 무식하게 풀어야 하나 해서 푼 방법
진짜 무식하게 2016년 1~12월의 월별 일수로 풀었다...

function solution(a, b) {
    let dayStr = ['SUN','MON','TUE','WED','THU','FRI','SAT'];
    let dayCnt = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    let date = b;
    for (let i=0; i<a-1; i++) {
        date += dayCnt[i];
    }
    let day = (4 + date) % 7;
    return dayStr[day];
}

넋두리 결론

문서를 잘 읽자. 😅
MDN 문서

반응형