[프로그래머스] 2016년 - JavaScript

coderH·2022년 7월 16일
0

프로그래머스코테

목록 보기
18/27
post-thumbnail

문제

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일같은 날짜는 주어지지 않습니다)

정답

function solution(month, date) {
    const days = ["SAT", "SUN", "MON", "TUE", "WED", "THU", "FRI"];
    const time = new Date(2016, month - 1, date + 1);
    
    const day = time.getDay();
    return days[day];
}

풀이

윤년은 2월이 29일까지 있기 때문에 1년 총 일수가 365일이 아닌 366일인 해입니다.

따라서 먼저 Date객체를 통해 날짜를 생성한 뒤 time 변수에 할당합니다.
이후 getDay메소드를 통해 해당 날짜의 요일을 받아옵니다.
반환값은 0~6이며 이는 원래 SUN~SAT를 뜻합니다.

하지만 2016년은 윤년이라 전체 일수가 하루 더 많기 때문에 days를 SUN이 아닌 SAT부터 시작되도록 해주면 통과할 수 있습니다.

다른 풀이

function solution(a, b) {
    const date = new Date(`2016-${a}-${b}`).toString();
    return date.slice(0, 3).toUpperCase();
}

Date로 받은 날짜를 toString메소드를 사용해 문자열로 변경하게 되면 맨 앞쪽에 3자리 형태로 이루어진 요일이 붙게 되는데 이를 slice(0, 3)으로 요일에 대한 문자열만 가져옵니다.
Fri와 같이 첫 글자만 대문자 형태의 문자열이기 때문에 toUpperCase메소드를 사용해줍니다.

만약 new Date의 인자를 문자열로 넣지 않을경우 new Date(2016, a - 1, b)로 입력해주어야 합니다.
이유는 Date객체에서 월을 숫자로 받을 때는 배열의 인덱스처럼 0부터 세기 때문입니다.

0개의 댓글