https://www.acmicpc.net/problem/8989
알고리즘
신선하고 재밌는 문제다. 일단 이 문제를 풀기 위해서 그림을 그렸는데, 그리고 나서 알게된 사실은
분침은 1분당 6도를, 시침은 1시간당 30도에 1/2*m을 한 각도를 갖는 것이다.
사실 처음에는 12시 ~ 3시까지 90도니까 3등분을 하면 한시간 당 30도를 갖겠지?!라고 생각하고 풀었는데, 시침은 1분 동안 0.5도씩 움직이기 때문에, 이 또한 고려해주어야 한다!!
따라서, 시침과 분침의 각도를 나타내는 코드는 다음과 같다.
# 1분 당 6도, 1시간 당 30도 + 0.5m
h_angle = h*30 + m*0.5
m_angle = m*6
또 이 문제를 풀 때 주의할 점은 시침, 분침의 각도를 각각 구하는 것이 아니라 두 시각이 갖는 사이의 각도가 필요하기 때문에 둘 중 큰 값의 각도를 작은 값의 각도로 빼주어야 시계가 가리키는 해당 시,분 사이의 각도를 구할 수 있다. 이때 작은 각도를 구한다고 했기 때문에 원에서 각도를 그렸을 때 둔각이 아닌 예각 부분을 구해주는 걸 주의해야 한다.
전체 코드
t = int(input())
for _ in range(t) :
li = input().split()
ans = []
for item in li :
h, m = map(int, item.split(':'))
# 일반적인 아날로그 시계 생각하면 h % 12 , m // 5
h %= 12
# 1분 당 6도, 1시간 당 30도 + 0.5m
h_angle = h*30 + m*0.5
m_angle = m*6
# 두 시각이 갖는 각 사이의 각도가 필요하니까 max, min..
angle = max(h_angle, m_angle) - min(h_angle, m_angle)
if angle >= 180 : angle = 360 - angle
ans.append([angle, item])
ans.sort()
idx = len(ans)//2
print(ans[idx][1])
알게된 점
- 시침과 분침의 각도
- 사이값 구하기
- A 리스트에 새로운 기준을 세워서 B 리스트를 만든 후, A 리스트를 출력하는 방법 : 이중 리스트
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/6186] Best Grass | bfs, dfs (0) | 2023.02.22 |
---|---|
[백준/6550] 부분 문자열 | 반복문으로 고정된 인덱스 다루기 (0) | 2023.02.21 |
[백준/2852] NBA 농구 (0) | 2023.02.16 |
[백준/6236] 용돈 관리 | 이진 탐색 트리 | 분할 | 파이썬 (0) | 2023.02.14 |
[백준/5430] AC | deque의 reverse() | reverse를 여러 번? (0) | 2023.02.13 |