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

C++로 시침과 분침 사이의 각도 계산하기

문제 개요

시(hour)와 분(minute)이라는 두 숫자가 주어졌을 때, 시침과 분침 사이에 형성되는 더 작은 각도(60분법 단위)를 구하는 것이 이 문제의 목표입니다.

예를 들어 hour = 12, min = 30이 입력으로 주어지면, 시침은 정확히 12와 1 사이의 절반 지점에 있고 분침은 6을 가리키므로 두 바늘 사이의 각도는 165°가 됩니다.

핵심 아이디어

각 바늘이 1분당 얼마나 회전하는지 이해하면 공식을 쉽게 유도할 수 있습니다.

  • 분침: 60분 동안 360°를 회전하므로 1분당 씩 움직입니다.

  • 시침: 12시간(= 720분) 동안 360°를 회전하므로 1분당 0.5°씩 움직입니다.

해결 알고리즘

다음 단계를 따라 문제를 해결할 수 있습니다.

  • h = 12이면 h := 0으로 설정합니다.

  • m = 60이면 m := 0으로 설정합니다.

  • 시침 각도: hAngle := 0.5 × (60 × h + m)

  • 분침 각도: mAngle := 6 × m

  • 두 각도의 차이: ret := |hAngle − mAngle|

  • ret와 (360 − ret) 중 더 작은 값을 반환합니다.

마지막 단계에서 두 값 중 최솟값을 선택하는 이유는, 두 바늘 사이에는 시계 방향 각도와 반시계 방향 각도 두 가지가 존재하기 때문입니다. 문제에서 요구하는 것은 항상 그중 더 작은 각도입니다.

C++ 구현 예제

아래 코드를 통해 실제 구현을 확인해 보겠습니다.

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    double angleClock(int h, int m) {
        if(h == 12) h = 0;
        if(m == 60) m = 0;
        double hAngle = 0.5*((60 * h) + m);
        double mAngle = 6 * m;
        double ret = abs(hAngle - mAngle);
        return min(360 - ret, ret);
   }
};
main(){
    Solution ob;
    cout << (ob.angleClock(12, 30));
}

입력

12
30

출력

165.00000