문제 개요
JavaScript에서 특정 일수를 나타내는 숫자를 입력받아, 이를 년(years), 월(months), 주(weeks), 일(days) 네 가지 속성으로 구성된 객체로 변환하는 함수를 작성해야 합니다.
단, 이 문제에서는 윤년을 고려하지 않으며, 모든 해는 365일로 간주합니다.
예를 들어 입력값이 738이라면, 출력은 다음과 같아야 합니다.
const output = {
years: 2,
months: 0,
weeks: 1,
days: 1
}구현 예제: 반복문 활용
가장 직관적인 방법은 while 반복문을 사용하여 남은 일수에서 큰 단위부터 차례대로 빼가는 것입니다.
const days = 738;
const calculateTimimg = d => {
let months = 0, years = 0, days = 0, weeks = 0;
while(d){
if(d >= 365){
years++;
d -= 365;
}else if(d >= 30){
months++;
d -= 30;
}else if(d >= 7){
weeks++;
d -= 7;
}else{
days++;
d--;
}
};
return {
years, months, weeks, days
};
};
console.log(calculateTimimg(days));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
{ years: 2, months: 0, weeks: 1, days: 1 }개선된 접근: 나눗셈과 나머지 연산 활용
반복문 대신 나눗셈(/)과 나머지 연산자(%)를 사용하면 코드를 더 간결하고 효율적으로 만들 수 있습니다. 일수가 아무리 커도 상수 시간 안에 계산이 완료됩니다.
const calculateTiming = d => {
const years = Math.floor(d / 365);
d %= 365;
const months = Math.floor(d / 30);
d %= 30;
const weeks = Math.floor(d / 7);
const days = d % 7;
return { years, months, weeks, days };
};
console.log(calculateTiming(738));
// { years: 2, months: 0, weeks: 1, days: 1 }Math.floor()로 해당 단위의 몫을 구하고, 나머지 연산으로 남은 일수를 갱신하는 방식입니다. 두 방법 모두 동일한 결과를 반환하며, 실무에서는 후자의 방식이 성능과 가독성 면에서 더 권장됩니다.