[프로그래머스/js] 2016년 요일 계산하기

이다형·2023년 7월 10일
0

문제 설명

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(a, b) {
    let mon = 0;
    let turn = true;
    let week =["THU","FRI","SAT","SUN","MON","TUE","WED"]
    for(let i=1;i<a;i++){
        turn?mon += 31:mon+=30
        turn = !turn
    }
    
    //윤년계산
    if(a>2)mon-=1;
    //7월이상에서 부족한부분 채우기
    if(a===9||a===11)mon++;
    
    return week[(b+mon)%7]
}

요일은 빠짐없이 일월화수목금~ 을 반복하기 때문에 1월1일의 요일을 기준으로 날짜를 더해서 계산한후 7로 나눈 나머지가 요일이된다.

예를 들어 2월 1일은 1+31의 32일

31과 30을 번갈아가며 더해주고
최종계산전에 윤년이므로 2월이상에서 -2일,
7월과 8월은 31,31로 반복되므로 하루가 부족한 월(9,11월)에 +1을 해주었다.

다른사람의 풀이1

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];
}

나와 같은 방식으로 접근했지만

날짜합산을 배열로 만들어서 반복문이 실행될때 해당 인덱스의 날짜를 더해주도록 했다.

이러면 내 풀이처럼 따로 윤년이나 모자란 일수를 계산하지 않아도되고 더 간결하고 짧은 코드이다.

다른사람의 풀이2

function getDayName(a,b){
    var tempDate = new Date(2016, a-1, b);

    return tempDate.toString().slice(0,3).toUpperCase();
}

날짜를 출력해주는 new Date()라는 함수가... 있었다...

Date() 는 날짜를

2016-05-23T15:00:00.000Z 

이런식으로 출력해주는데 toString()으로 변환해주면

'Tue May 24 2016 00:00:00 GMT+0900 (한국 표준시)'

같은 형식으로 변환되어 나온다....

요일이 나타나는 앞 3글자를 slice(0,3) 해주고 대문자로 변환 toUpperCase() 하면 문제에서 원하는 답이 출력된다.

0개의 댓글