HH:MM 형식의 24시간제 디지털 시계가 주어졌을 때, 주어진 시간(시, 분) 동안 시계의 네 자리 숫자가 모두 동일한 경우가 몇 번 발생하는지 세는 문제입니다.
문제 이해
24시간 형식에서 시(HH)와 분(MM)의 모든 숫자가 같은 경우는 하루에 단 3번뿐입니다.
- 00:00 (자정)
- 11:11
- 22:22
33:33이나 44:44는 24시간제에서 존재하지 않는 시간이므로 제외됩니다. 입력으로 주어진 총 시간(시간 + 분) 범위 안에 이 3가지 시각이 몇 번 포함되는지 확인하면 됩니다.
입력 및 출력 예시
예시 1
입력: 12시간 22분
출력: 2
설명: 00:00, 11:11 (2회 발생)
예시 2
입력: 48시간 22분
출력: 5
설명: 2일 치(00:00, 11:11, 22:22 × 2일) + 3일째 00:00, 11:11 (총 5회)
해결 접근법
- 입력받은 시간과 분을 총 분(Total Minutes)으로 변환합니다.
- 하루(1440분)당 발생 횟수는 3회(00:00, 11:11, 22:22)입니다.
- 전체 일 수와 나머지 분을 계산합니다.
- 나머지 시간(분)에 포함되는 동일 숫자 시각(00:00 = 0분, 11:11 = 671분, 22:22 = 1342분)을 직접 비교하여 카운트합니다.
C++ 구현 (수정된 로직)
제공된 원본 코드는 33:33, 44:44 등 존재하지 않는 시간을 세는 버그가 있었습니다. 아래는 올바르게 수정된 구현입니다.
#include <iostream>
using namespace std;
int countIdentical(int hours, int minutes) {
// 입력 시간을 총 분으로 변환
int totalMinutes = hours * 60 + minutes;
// 하루(1440분)당 3회 발생 (00:00, 11:11, 22:22)
int fullDays = totalMinutes / 1440;
int remainingMinutes = totalMinutes % 1440;
int count = fullDays * 3;
// 하루 내 동일 숫자 시각들의 분 단위 인덱스 (00:00=0, 11:11=671, 22:22=1342)
int identicalTimes[3] = {0, 11 * 60 + 11, 22 * 60 + 22}; // {0, 671, 1342}
// 남은 시간 내에 포함되는지 확인
for (int i = 0; i < 3; ++i) {
if (identicalTimes[i] < remainingMinutes) {
count++;
}
}
return count;
}
int main() {
int hours = 48;
int minutes = 22;
cout << "동일 숫자 표시 횟수: " << countIdentical(hours, minutes) << endl;
// 출력: 동일 숫자 표시 횟수: 5
return 0;
}
코드 설명
- 총 분 계산: 시간을 분으로 통일하여 계산 로직을 단순화했습니다.
- 하루 단위 처리: 1440분(24시간)마다 3회가 보장되므로 곱셈으로 빠르게 처리합니다.
- 나머지 시간 처리: 배열
identicalTimes에 유효한 3개 시각(0, 671, 1342분)을 저장하고, 남은 시간보다 작은 것만 카운트합니다. - 시간 복잡도: O(1) - 루프가 고정된 3회만 돌기 때문입니다.
- 공간 복잡도: O(1)
요약
이 문제는 복잡한 시뮬레이션 없이 수학적 규칙(하루 3회 고정 발생)과 유효한 시각 목록(00:00, 11:11, 22:22)만 알면 상수 시간에 해결할 수 있습니다. 입력 범위가 커져도 성능 저하 없이 정확한 결과를 얻을 수 있습니다.