Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 디지털 시계의 동일 숫자 표시 횟수 세기

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회)

해결 접근법

  1. 입력받은 시간과 분을 총 분(Total Minutes)으로 변환합니다.
  2. 하루(1440분)당 발생 횟수는 3회(00:00, 11:11, 22:22)입니다.
  3. 전체 일 수와 나머지 분을 계산합니다.
  4. 나머지 시간(분)에 포함되는 동일 숫자 시각(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)만 알면 상수 시간에 해결할 수 있습니다. 입력 범위가 커져도 성능 저하 없이 정확한 결과를 얻을 수 있습니다.