https://www.acmicpc.net/problem/8989
문제
기원이의 방에는 시침과 분침으로 이루어진 아날로그 시계가 있다. 기원이는 시침과 분침이 형성하는 각도 중 작은 각도를 측정하는 것이 취미이며, 이 각도는 0보다 크거나 같고 180보다 작거나 같다.
기원이는 서로 다른 5개의 시간이 hh:mm의 형태로 주어졌을 때, 중간값을 갖는 각도가 몇 시 인지 궁금해져서 이를 알아내는 프로그램을 만들고자 한다.
즉, 주어진 시간들이 이루는 각도를 기준으로 오름차순 정렬했을 때, 세 번째에 위치한 시간을 찾으면 되는 것이다. 만일 동일한 각도를 갖는 시간들이 있으면, 빠른 시간 순서대로 정렬한다.
예를들어 06:05, 07:10, 03:00, 21:00, 12:55 가 주어졌으면, 정렬 결과는 12:55, 03:00, 21:00, 06:05, 07:10 이 되고, 중간 값은 21:00 이 된다.
기원이를 도와 주어진 시간들의 각도 중 중간값을 갖는 시간이 언제인지 찾는 프로그램을 작성해보자
입력
입력의 첫 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 5개의 hh:mm의 형식으로 이루어진 시간 데이터로 구성되어 있으며, 띄어쓰기 한칸으로 구분되어 있다.
단, 00 ≤ hh ≤ 23이고, 00 ≤ mm ≤ 59이다
출력
각 테스트 케이스마다 주어진 시간 데이터들 중, 중간 각도 값을 갖는 시간을 hh:mm의 형태로 출력한다.
코드
input = __import__('sys').stdin.readline
T = int(input().rstrip())
for i in range(T) :
time_list = list(input().rstrip().split())
angle_list = []
for j in range(5) :
h = int(time_list[j][0:2]) % 12
m = int(time_list[j][3:5])
angle = abs(h * 30 + 0.5 * m - m * 6)
if angle > 180 :
angle = 360 - angle
angle_list.append(angle)
time_list = sorted(time_list, key = lambda x : [angle_list[time_list.index(x)], int(x[0:2]) * 60 + int(x[3:5])])
print(time_list[2])
각도를 구할 때 시침이 0도부터 움직인 각도는 시 * 30 + 분 * 0.5 도 이고, 분침이 움직인 각도는 분 * 6 도 이다.
시침은 1분마다 0.5도 움직인다는 것을 처음에는 까먹고 풀다가 수정하였다.
이렇게 구한 각도들을 리스트에 저장해 둔 뒤, 나중에 정렬을 할 때 사용한다.
lambda 함수를 이용하여 정렬을 하였는데, 파라미터 활용이 생각보다 까다로웠고, 내가 파라미터에 대해서 잘못알고 있던 부분들을 알게 되었다.
그 부분들을 제외하면 어렵지 않은 문제였다.
'Koala - 14기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준/Python] 16955번 오목, 이길 수 있을까? (0) | 2024.05.19 |
---|---|
[백준/Java] 11383번 : 뚊 (0) | 2024.05.13 |
[백준/Java] 15874번 : Caesar Cipher (0) | 2024.05.06 |
[백준/Python] 5430번 AC (0) | 2024.05.05 |
[백준/Python3] 10798번 세로읽기 (0) | 2024.05.05 |