백준 BOJ 17843 시계
https://www.acmicpc.net/problem/17843
파이썬 python 문제 풀이
문제
어느 날, 할 것이 없던 윤표는 시계를 관찰하기 시작했다. 어느 순간 윤표는 시계가 하나의 원이라는 사실을 깨달았다. 또, 시계의 중심에서 시침, 분침, 그리고 초침의 방향으로 반직선을 그어 시계의 둘레와 만나는 점을 각각 A, B, C라고 하고, 시계의 중심점을 O라고 했을 때 OA, OB, OC 중 어느 두 반직선이 이루는 각들을 비교하다가 어떤 각이 가장 작은지 궁금해졌다. OA, OB, OC 중 어느 두 반직선이 이루는 각 중 최소 각을 출력하는 프로그램을 만드시오. 단, 각도의 단위는 도(°)이다.
입력
첫 번째 줄에 테스트 케이스 개수 T(1 ≤ T ≤ 3,000)가 주어지고 2번째 줄부터 T+1 번째 줄까지 한 줄에 하나씩 h시 m분 s초(0 ≤ h ≤ 11, 0 ≤ m ≤ 59, 0 ≤ s ≤ 59. h, m, s는 정수)가 공백으로 구분되어 주어진다.
출력
T개의 테스트 케이스 각각에 대해 OA, OB, OC 중 어느 두 반직선이 이루는 각 중 최소의 각을 출력한다.
실제 정답과 출력 값의 절대오차 또는 상대오차가 10-6 이하이면 정답으로 처리된다.
풀이
# 17843 시계
# 실버 5
import sys
t = int(sys.stdin.readline())
for _ in range(t):
h, m , s = map(int, sys.stdin.readline().split())
# 분침에 초에 따른 영향 고려
m += s / 60.0
# 시침을 60분 기준으로 환산, 분에 따른 이동량 추가
h *= 5.0
h += (m / 60.0) * 5.0
# 세 값 정렬
arr = [h, m, s]
arr.sort()
# 가능한 각 중 최솟값을 찾기
res = 360.0
for i in range(1, 3):
diff = (arr[i] - arr[i - 1]) * 6.0 # 1단위 = 6도
if diff %3C res:
res = diff
# 원의 마지막과 처음 사이 간격 고려
e = (arr[0] + 60.0 - arr[2]) * 6.0
if e < res:
res = e
# 소수점 아래 6자리까지 출력
print(f"{res:.6f}")>)