https://www.acmicpc.net/problem/1942
문제
> 시계정수란 hh:mm:ss의 형태로 표현된 시간을 hhmmss로 :를 제외하고 나타냈을때 얻을 수 있는 정수이다. 즉, 오후5시 29분 17초는 172917이다.
> 특정 시간의 구간, 시작시간과 끝 시간을 줬을때 해당 구간에 있는 시간정수 중 3의 배수의 개수가 몇개인지 구해라.
접근
시간정수를 얻기 위해 먼저 디지털 시계를 정의하고 시작구간 끝구간을 이용해 반복문을 돌려 얻은 정수들을 3의 배수인지 검증한다.
문제해결
> 시작시간 끝시간을 시, 분, 초로 :문자를 기준으로 나눠 입력받고 무한 반복문으로 각각의 자릿수를 다 더해 3으로 나눴을때 나눠지면 3의 배수라는 성질을 이용해 cnt값에 결과를 누적한다.
반복문을 깨는 조건은 시작시간과 끝시간이 모두 같아질때로 주고 시간을 증가시킨다. 초가60을 넘어가면0으로 초기화 한 후 분을 증가시킨다. 시도 마찬가지로 분이 60이 되면 증가시킨다.
시작시간이 24시를 넘어 0시로 다시 가는 부분을 위해 시를 증가시키다24가 되면 0으로 값을 다시 주고 초를 증가시켜 끝시간과 같을때까지 반복한다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t = 3;
vector<int> result;
while (t--)
{
int sh, sm, ss, eh, em, es;
char c;
cin >> sh >> c >> sm >> c >> ss;
cin >> eh >> c >> em >> c >> es;
int cnt = 0;
while (1)
{
int sum = (sh / 10 + sh % 10 + sm / 10 + sm % 10 + ss / 10 + ss % 10);
if (sum % 3 == 0) cnt++;
if (sh == eh && sm == em && ss == es) break;
ss += 1;
if (ss >= 60)
{
ss = 0;
sm += 1;
}
if (sm >= 60)
{
sm = 0;
sh += 1;
}
if (sh >= 24)
{
sh = 0;
}
}
result.push_back(cnt);
}
for (int i : result)
cout << i << '\n';
}

후기
while문을 깨는 조건을 시작시간이 끝나는 시간보다 클때(24시를 넘어 00으로 초기화 되는 부분) 하나, 그렇지 않을때 하나, 해서 복잡하게 만들어 계속 틀렸다. 시작시간과 끝시간이 같아질때 검증이 빠져있었다.
반복문 앞쪽에 시간이 같은 경우 검증을 먼저하면 시작시간이 클때를 구분할 필요없이 뒤에 24시를 넘어가면 0으로 초기화하면 되는걸 알았다.
코드가 2배 줄어드는걸 보고 생각이 많아졌다.