문제 개요
이번 글에서는 일(day), 월(month), 연도(year) 세 가지 인수를 받아 해당 날짜가 무슨 요일인지 계산하는 JavaScript 함수를 만들어 보겠습니다.
예를 들어 다음과 같은 입력이 주어졌을 때 −
day = 15,
month = 8,
year = 1993
출력 결과
함수는 아래와 같은 결과를 반환해야 합니다 −
const output = 'Sunday'; // 일요일
구현 코드
const dayOfTheWeek = (day, month, year) => {
// JS의 월(month)은 0부터 시작하므로 1을 빼서 전달
return dayOfTheWeekJS(day, month - 1, year);
}
function dayOfTheWeekJS(day, month, year) {
const DAYS = [
'Sunday', // 일요일
'Monday', // 월요일
'Tuesday', // 화요일
'Wednesday', // 수요일
'Thursday', // 목요일
'Friday', // 금요일
'Saturday', // 토요일
];
const DAY_1970_01_01 = 4; // 1970년 1월 1일은 목요일(인덱스 4)
let days = day - 1;
while (month - 1 >= 0) {
days += daysInMonthJS(month - 1, year);
month -= 1;
}
while (year - 1 >= 1970) {
days += daysInYear(year - 1);
year -= 1;
}
return DAYS[(days + DAY_1970_01_01) % DAYS.length];
}
function daysInMonthJS(month, year) {
const days = [
31, // 1월
28 + (isLeapYear(year) ? 1 : 0), // 2월 (윤년 처리)
31, // 3월
30, // 4월
31, // 5월
30, // 6월
31, // 7월
31, // 8월
30, // 9월
31, // 10월
30, // 11월
31, // 12월
];
return days[month];
}
function daysInYear(year) {
return 365 + (isLeapYear(year) ? 1 : 0);
}
function isLeapYear(year) {
return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;
}
console.log(dayOfTheWeek(15, 8, 1993));코드 설명
핵심 아이디어는 주어진 날짜까지 총 며칠이 지났는지 세는 것입니다. 이를 위해 유닉스 시간(Unix Epoch)의 시작점인 1970년 1월 1일(목요일)을 기준으로 삼습니다.
완전히 지난 연도: 각 연도의 전체 일수를 더합니다. 이때 윤년 여부를 반영해 365일 또는 366일로 계산합니다.
완전히 지난 달: 해당 연도 내에서 지나간 달들의 일수를 더합니다. 2월은 윤년이면 29일로 처리됩니다.
남은 일수: 현재 달에서 경과한 일수(day - 1)를 더합니다.
마지막으로 총 일수를 7로 나눈 나머지를 구하고, 1970년 1월 1일이 목요일이라는 기준값(인덱스 4)을 더해 요일 배열의 인덱스를 계산하면 원하는 요일을 얻을 수 있습니다.
실행 결과
콘솔에는 다음과 같이 출력됩니다 −
Sunday
추가 팁
실무에서는 위처럼 직접 계산하기보다 내장 Date 객체를 활용하는 것이 더 간단하고 안전합니다. 예를 들어 new Date(1993, 7, 15).getDay()를 호출하면 요일 인덱스(0~6)를 바로 얻을 수 있으며, 시간대 관련 오류도 피할 수 있습니다. 다만 날짜 계산의 동작 원리를 이해하는 데는 위 알고리즘이 좋은 학습 예제가 됩니다.