문제
현재 시각과 알람 시각이 HH:MM:SS로 주어질 때, 알람이 울릴 때까지 남은 시간을 구하라. 같은 시각이면 24:00:00을 출력한다.
입력
현재 시각과 알람 시각이 HH:MM:SS 형태로 주어진다.
출력
남은 시간을 HH:MM:SS 형태로 출력한다.
예제
| 입력 | 출력 |
|---|---|
20:00:00 04:00:00 | 08:00:00 |
풀이
시각을 초 단위로 변환하여 차이를 구하고, 24시간 순환을 처리한다.
- 시각 문자열을 파싱하여 초 단위 정수로 변환한다
- 알람 시각 - 현재 시각의 차이를 구한다
- 차이가 음수면 246060을 더한다 (다음 날)
- 차이가 0이면 "24:00:00"을 출력한다
- 그 외에는 시:분:초 형식으로 출력한다
핵심 아이디어: 시각을 초로 통합하면 단순 뺄셈으로 시간 차이를 구할 수 있고, 음수는 24시간 추가로 처리한다.
코드
#include <iostream>
using namespace std;
int ttoi(char t[])
{
return ((t[0] & 15) * 10 + (t[1] & 15)) * 60 * 60 + ((t[3] & 15) * 10 + (t[4] & 15)) * 60 + ((t[6] & 15) * 10 + (t[7] & 15));
}
int main()
{
char ct[9], na[9];
cin >> ct >> na;
int c = ttoi(ct), e = ttoi(na), t = e - c;
if (t < 0)
t += 24 * 60 * 60;
if (t == 0)
cout << "24:00:00";
else
printf("%02d:%02d:%02d", t / 60 / 60, t / 60 % 60, t % 60);
return 0;
}복잡도
- 시간: O(1)
- 공간: O(1)