상세 컨텐츠

본문 제목

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

프로그래밍 및 언어/코딩 테스트 문제

by 남민우_ 2024. 11. 22. 09:23

본문

문제

 

입출력 예시

a b result
5 24 "TUE"

 

 

풀이

function solution(a, b) {
    let answer = '';
    const days = ["THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED"];
    const months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

    let totalDay = 0;
    for (let i = 0; i < a - 1; i++) {
        totalDay += months[i];
    }
    totalDay += b;

    answer = days[totalDay % 7];

    return answer;
}

 

날짜의 계산 방식을 알고 있다면 비교적 간단한 문제다.

모든 날짜는 7일을 기준으로 순환 반복하며, 매 달마다 정해진 일 수가 있다. 예를 들어 1일이 금요일이면 7일을 더한 8일이 금요일, 다시 7일을 더한 15일이 금요일이 반복되는 식이다.

해서 코드를 다음과 같이 구성하였다.

 

먼저 정답을 기입할 answer, 날짜 문자열들을 입력해둔 days, 한 달마다 총 날짜수가 어떻게 되는지 입력해둔 months 이다.

여기서 잘 살펴봐야 하는 것은 days 의 순서가 "THU" 부터 시작이다. 주어진 문제에서 1월 1일이 금요일 FRI 이기 떄문에 이를 인덱스값 1이라고 기준을 잡고 해당 위치에 올 수 있도록 순서를 구성했다.

다음은 months 의 두번째 인덱스, 29라는 숫자인데 문제의 제한조건에서 이 2016년은 '윤년' 이라고 설명하였다. 

더보기

윤년이란?

윤년(閏年)은 역법을 실제 태양년에 맞추기 위해 여분의 하루 또는 월(月)을 끼우는 해이다. 태양년은 정수의 하루로 나누어떨어지지 않고,  공전주기 지구의 공전주기는 다르기 때문에 태양력에서는 하루(윤일), 태음태양력에서는 한 달(윤달)을 적절한 시기에 끼워서 이를 보정한다.

출처 - 위키백과(https://ko.wikipedia.org/wiki/%EC%9C%A4%EB%85%84)

즉 2월이 29일이라는 말이다.

 

그 다음 코드로 내려가면 totalDay 를 선언 및 반복문이 활용되고 있다.

반복 시행은 i 가 0부터 a - 1까지, 즉 a가 3월 이라고 입력을 받았다면 0, 1 만 반복한다는 것이다.

이렇게 작성한 이유로는 예를 들어 3월 22일 을 생각했을 때, 이번년도가 시작된 이후 3월 22일까지의 총 날짜수는? 이라고 물어본다면 [1월의 총 날짜 + 2월의 총 날짜 + 22일] 이라고 답할 수 있다.

해서 주어진 a의 지난 달까지의 총 날짜수를 더하기 위해 반복 조건을 구성하였고 반복문이 끝나고 난 후 b 값을, 예시의 22일을 더해주었다.

 

그 이후에 이 총 날짜수를 7로 나눈 나머지값을 인덱스로 하여 days 배열에서 결과를 도출한다.

처음 days 선언 시 "FRI" 의 인덱스가 1이 되도록 선언을 해주었기에 그보다 초과된 값, 즉 나머지값만 구하면 되는 문제였다.

관련글 더보기