문제 개요
시(hour)와 분(minute)이라는 두 숫자가 주어졌을 때, 시침과 분침 사이에 형성되는 더 작은 각도(60분법 단위)를 구하는 것이 이 문제의 목표입니다.
예를 들어 hour = 12, min = 30이 입력으로 주어지면, 시침은 정확히 12와 1 사이의 절반 지점에 있고 분침은 6을 가리키므로 두 바늘 사이의 각도는 165°가 됩니다.
핵심 아이디어
각 바늘이 1분당 얼마나 회전하는지 이해하면 공식을 쉽게 유도할 수 있습니다.
분침: 60분 동안 360°를 회전하므로 1분당 6°씩 움직입니다.
시침: 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