이 튜토리얼에서는 주어진 시간을 영어 단어 형태로 변환하는 프로그램을 다룹니다. 디지털 형식(hh:mm)으로 표현된 특정 시간이 입력으로 제공되며, 우리가 해야 할 작업은 해당 시간을 일상에서 흔히 쓰는 영어 시간 표현으로 바꾸는 것입니다.
시간 표현 규칙
영어권에서는 시간을 말할 때 분 값에 따라 다양한 관용 표현을 사용합니다. 이 프로그램은 아래 규칙에 따라 입력된 시간을 문자열로 변환합니다.
- m == 0 : 정각 → "eight o' clock"
- m == 1 : 1분 지났음 → "one minute past eight"
- m == 59 : 다음 시까지 1분 남음 → "one minute to nine"
- m == 15 : 15분 → "quarter past eight"
- m == 30 : 30분 → "half past eight"
- m == 45 : 다음 시까지 15분 남음 → "quarter to nine"
- m <= 30 : "~ minutes past ~" 형식으로 지나간 분을 표현
- m > 30 : "~ minutes to ~" 형식으로 남은 분을 표현
C++ 구현 예제
#include <bits/stdc++.h>
using namespace std;
//printing time in words
void convert_time(int h, int m){
char nums[][64] = {
"zero", "one", "two", "three", "four",
"five", "six", "seven", "eight",
"nine", "ten", "eleven", "twelve",
"thirteen", "fourteen", "fifteen",
"sixteen", "seventeen", "eighteen",
"nineteen", "twenty", "twenty one",
"twenty two", "twenty three",
"twenty four", "twenty five", "twenty six",
"twenty seven", "twenty eight", "twenty nine",
};
if (m == 0)
printf("%s o' clock\n", nums[h]);
else if (m == 1)
printf("one minute past %s\n", nums[h]);
else if (m == 59)
printf("one minute to %s\n", nums[(h % 12) + 1]);
else if (m == 15)
printf("quarter past %s\n", nums[h]);
else if (m == 30)
printf("half past %s\n", nums[h]);
else if (m == 45)
printf("quarter to %s\n", nums[(h % 12) + 1]);
else if (m <= 30)
printf("%s minutes past %s\n", nums[m], nums[h]);
else if (m > 30)
printf("%s minutes to %s\n", nums[60 - m], nums[(h % 12) + 1]);
}
int main(){
int h = 8;
int m = 29;
convert_time(h, m);
return 0;
}
출력 결과
twenty nine minutes past eight
코드 설명
핵심은 0부터 29까지의 숫자를 영어 단어로 미리 저장해 둔 배열 nums입니다. 31분 이상인 경우 60에서 분 값을 빼면 다음 정각까지 남은 분이 되므로 같은 배열을 그대로 재사용할 수 있습니다. 또한 (h % 12) + 1 계산을 통해 12시간제 기준의 다음 시(hour)를 간단히 구할 수 있습니다. 예제에서는 8시 29분이 입력되었으며, 29분은 30분 이하이므로 "twenty nine minutes past eight"(8시 29분 지났음)라는 문장이 출력됩니다.