프론트엔드 개발자의 기록 공간

[프로그래머스 JavaScript] 2016년 본문

알고리즘_JS/프로그래머스_Level1

[프로그래머스 JavaScript] 2016년

[리우] 2021. 6. 9. 16:57

프로그래머스 Level1 2016

문제 설명 : 단순 해당 일과 월이 주어졌을때, 맞는 날짜를 출력해주면된다.

 

저는 문제접근을 다음과 같이 구상했습니다. 

기본적으로는 2016년만 해당하면 되기 때문에 2016년에 해당하는 각 월마다 날짜요일을 배열로 넣어주고

각 월에 따라 일수를 계산하면 되지만 친구가 년도, 월, 일에 상관없이 날짜 구하는 공식이 있다는 얘기를 듣고나중에 비슷한 문제가 나왔을때 써먹기 위해 공식을 이용했습니다.

 

* 젤러 공식 - 그레고리력

 

function solution(a, b) {
    var answer = '';
    let y = 16;
    //날짜구하는 젤러 공식 그레고리력...
    let date = {
        0:'SAT',
        1:'SUN',
        2:'MON',
        3:'TUE',
        4:'WED',
        5:'THU',
        6:'FRI',
    };
    //1,2월인 경우 13,14월로 계산해주고
    //12월이 넘어 가므로 입력해 -1년도로 맞춰줌
    if(a===2 || a===1){
        a += 12;
        y -= 1;
    }

    
    //공식에의해 내림차순으로 계산
    let h = ((b+Math.floor(13*(a+1)/5)+y+Math.floor(y/4)+Math.floor((20/4)-40)) % 7);

    //h가 음수가 나올 경우가 존재한다.(세기의 값에 따라)
    //mod 7에따라 해당 음수 +7을 해주면된다.
    if(h<0) h+=7;
    
    answer = date[h];
    return answer;
}

코드 설명 : 해당 공식에 따라 연산을 해주고 각 날짜에 맞는 요일을 선택하여 출력해주면됩니다.

공식을 사용하되 두가지 조건을 처리해주어야합니다. 

젤러 공식 설명에도 나와있듯이 1월과 2월일 경우 13월 14월로 바꿔주고 년도 -1년을 해줘야합니다.

그리고 공식에서 나온값이 세기의 값에 따라 음수가 나올수도 있습니다. 이 경우 절대값으로 바꿔준후 7로 나눠주면 양수로 계산했을때와 같은 값이 나옵니다.

 

*해당 문제에서 세기는 20으로 고정이기 때문에 20으로 고정해줬습니다.

 

728x90
Comments