본문 바로가기
코딩 - 알고리즘

[프로그래머스] - 2016년 (자바스크립트)

by sky211b 2023. 4. 12.

문제 

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년은 윤년입니다

 

요점 

일 수를 계산해 요일을 알아낼 수 있어야 한다. 나는 딥다이브에서 읽었던 Date.prototype.getDay() 메서드를 사용했다. 

date메서드는 주어진 객체의 요일을 나타내는 정수를 반환한다. 

예를 들어 new Date('2016/05/24').getDay() = 2

일, 월, 화, 수, 목, 금, 토 순서대로 0, 1, 2, 3, 4, 5, 6을 반환한다.

 

이때 Date안에 객체의 월, 일이 한자리 숫자여도 된다. 앞에 0을 꼭 붙이지 않고 전달해도 된다. 

new Date('2016/05/04').getDay() === new Date('2016/5/4').getDay() 

 

풀이

반환되는 정수를 날짜로 표현하기 위해 날짜 순서를 담은 배열을 만들어 이용했다. 

function solution(a, b) {

    let date =["SUN","MON",'TUE','WED','THU','FRI','SAT']
  
    let answer = new Date(`2016/${m}/${d}`).getDay();
    return date[answer];
}

 

Reference 풀이 

Date메서드를 모를때 유용하다. 

각 월의 일수를 배열에 넣고 [해당 월(a) 이전까지의 일 수] + [해당 월의 일 수(b)]를 더해 7로 나눴다. 이 때 1월1일이 금요일이므로, 위의 풀이와는 달리 date배열은 'THU'부터 시작해야 한다.  

function solution(a, b) {
    const monthDay = [31,29,31,30,31,30,31,31,30,31,30,31]
    const weekDay = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"]

    let days = b //현재 달의 날짜 
    
    //반복문을 통해 현재 달 이전까지의 모든 일 수를 더 한다. 
    for(let i=0 ; i<a-1 ; i++)
        days += monthDay[i];

    return weekDay[days%7]; //7로 나누고 남은 수로 요일을 찾는다. 
}