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

C++로 시침·분침 사이의 각도가 세타와 일치하는 시각 찾기

세타(θ), 즉 각도 값이 하나 주어져 있다고 가정해 보겠습니다. 목표는 시침과 분침 사이의 각도가 정확히 이 값이 되는 시각을 hh:mm 형식으로 찾는 것입니다. 예를 들어 주어진 각도가 90°라면 답은 3:00이 될 수 있습니다.

접근 방법

시계에는 총 12시간이 표시되므로 시(hour)의 후보는 12가지, 분(minute)의 후보는 60가지입니다. 따라서 가능한 모든 시각 조합을 반복문으로 하나씩 확인하는 완전 탐색(brute force) 방식을 사용할 수 있습니다. 각 시각에서 시침과 분침이 이루는 각도를 계산하여, 주어진 세타 값과 일치하면 해당 시각을 출력하면 됩니다.

두 바늘의 각도는 다음과 같이 구할 수 있습니다.

  • 시침의 각도: 시침은 12시간(720분) 동안 360°를 회전하므로 1분당 0.5°씩 움직입니다. 즉, 0.5 × (hour × 60 + minute)
  • 분침의 각도: 분침은 60분 동안 360°를 회전하므로 1분당 6°씩 움직입니다. 즉, 6 × minute

두 각도 차이의 절댓값을 구한 뒤, 360°에서 뺀 값과 비교하여 더 작은 값을 선택하면 두 바늘 사이의 최소 각도를 얻을 수 있습니다.

예제 코드

#include<iostream>
#include<cmath>
using namespace std;
float angleFromClockHand(int hour, int minute) {
    float hour_angle = 0.5 * (hour*60 + minute);
    float minute_angle = 6*minute;
    float angle = abs(hour_angle - minute_angle);
    angle = min(360-angle, angle);
    return angle;
}
void findTime(float theta) {
    for (int hour=0; hour<12; hour++) {
        for (int min=0; min<60; min++) {
            if (angleFromClockHand(hour, min)==theta) {
                cout << hour << ":"<< min;
                return;
            }
        }
    }
    cout << "Unable to find time";
}
int main() {
    float angle = 45.0;
    findTime(angle);
}

실행 결과

4:30

각도 45.0°가 입력되면 프로그램은 모든 시각 조합을 순서대로 확인한 뒤, 조건을 처음으로 만족하는 4:30을 출력합니다. 실제로 4시 30분에는 시침이 135° 위치에, 분침이 180° 위치에 있어 두 바늘 사이의 각도가 정확히 45°가 됩니다. 참고로 float 자료형의 부동소수점 오차 때문에 실수 비교가 실패할 수 있으므로, 실무 환경에서는 허용 오차(epsilon)를 두고 비교하는 것이 더 안전합니다.