문제 소개
초(second) 단위의 숫자 하나를 입력받아, 그 안에 포함된 년, 일, 시간, 분, 초를 사람이 읽기 쉬운 문자열 형태로 변환해 반환하는 자바스크립트 함수를 만들어 보겠습니다. 계산을 단순화하기 위해 이 글에서는 모든 연도를 365일로 가정하며, 윤년은 고려하지 않습니다.
예를 들어 함수에 다음과 같은 값이 입력되면,
const num = 5454776657;
반환되어야 할 문자열은 다음과 같습니다.
'172년, 353일, 23시간, 44분 그리고 17초'
접근 방식: 나눗셈과 나머지 연산
이 문제의 핵심은 나눗셈(/)과 나머지 연산(%), 두 가지 연산자입니다. 먼저 각 시간 단위가 몇 초에 해당하는지 정리하면 다음과 같습니다.
- 1분 = 60초
- 1시간 = 60 × 60 = 3,600초
- 1일 = 3,600 × 24 = 86,400초
- 1년 = 86,400 × 365 = 31,536,000초
전체 초를 가장 큰 단위(년)의 초 수로 나눈 몫이 년의 개수이고, 남은 나머지를 다음 단위(일)에 적용하는 식으로 가장 작은 단위까지 반복하면 됩니다. 이렇게 하면 각 단위의 값이 서로 겹치지 않고 정확하게 계산됩니다.
구현 코드
const findTime = (num) => {
// 1 미만의 값은 의미 있는 시간 단위가 없으므로 '0' 반환
if (num < 1) return '0';
const oneMinute = 60;
const oneHour = oneMinute * 60; // 3,600초
const oneDay = oneHour * 24; // 86,400초
const oneYear = oneDay * 365; // 31,536,000초
const times = [
{ unit: '년', value: Math.floor(num / oneYear) },
{ unit: '일', value: Math.floor((num % oneYear) / oneDay) },
{ unit: '시간', value: Math.floor((num % oneDay) / oneHour) },
{ unit: '분', value: Math.floor((num % oneHour) / oneMinute) },
{ unit: '초', value: num % oneMinute },
];
// 값이 0인 단위는 결과 문자열에서 제외
const parts = times
.filter(({ value }) => value > 0)
.map(({ value, unit }) => `${value}${unit}`);
if (parts.length === 0) return '0';
if (parts.length === 1) return parts[0];
// 마지막 항목 앞에 '그리고'를 붙여 자연스럽게 연결
return parts.slice(0, -1).join(', ') + ' 그리고 ' + parts[parts.length - 1];
};
console.log(findTime(5454776657));
실행 결과
172년, 353일, 23시간, 44분 그리고 17초
코드 상세 설명
1. 기준 단위 정의
분, 시간, 일, 년이 각각 몇 초인지 곱셈으로 차례대로 정의합니다. 숫자를 직접 하드코딩하지 않기 때문에 코드의 가독성과 유지보수성이 크게 향상됩니다.
2. 몫과 나머지로 단위별 값 추출
원본 예제에서는 정수 변환을 위해 비트 연산자 ~~(double bitwise NOT)를 사용했지만, 여기서는 의도가 더 명확한 Math.floor()를 사용했습니다. 예를 들어 (num % oneYear) / oneDay는 1년분을 제외하고 남은 초를 일 단위로 나눈 값이며, 여기서 정수 부분만 취하면 '일'의 개수가 됩니다.
3. 0인 단위 제거 및 문자열 조합
filter()로 값이 0인 단위를 걸러내면 '172년, 0일, …'처럼 불필요한 항목이 출력되지 않습니다. 이후 join()으로 항목을 쉼표로 연결하고, 마지막 항목 앞에는 '그리고'를 붙여 한국어 문장처럼 자연스러운 결과를 완성합니다. 영어권 형식(and)이 필요하다면 마지막 연결 문자열만 바꿔 주면 됩니다.
마무리
나눗셈과 나머지 연산만 활용하면 별도의 날짜 라이브러리 없이도 초를 년·일·시간·분·초로 손쉽게 변환할 수 있습니다. 다만 윤년까지 정확하게 처리해야 하는 실제 서비스라면 Date 객체나 day.js, date-fns 같은 검증된 라이브러리를 사용하는 것이 안전합니다.