문제
https://www.acmicpc.net/problem/8989
8989번: 시계
기원이의 방에는 시침과 분침으로 이루어진 아날로그 시계가 있다. 기원이는 시침과 분침이 형성하는 각도 중 작은 각도를 측정하는 것이 취미이며, 이 각도는 0보다 크거나 같고 180보다 작거나
www.acmicpc.net
문제 요약
서로 다른 5개의 시간이 hh:mm 형태로 주어졌을 때, 중간값을 갖는 각도가 몇 시인지 출력한다.
+ 각도는 시침과 분침이 형성하는 각도 중 작은 각도이다.
즉, 주어진 시간들이 이루는 각도를 기준으로 오름차순 정렬했을 때, 세 번째에 위치한 시간을 찾으면 된다.
+ 동일한 각도를 갖는 시간들이 있으면, 빠른 시간 순서대로 정렬한다.
코드
#include <iostream>
#include <vector>
#include <tuple>
#include <string>
#include <algorithm>
#define MAX_N 100000
using namespace std;
int T;
double time_angle(string str) {
int hour = (str[0] - '0') * 10 + (str[1] - '0');
if (hour >= 12) hour -= 12;
int min = (str[3] - '0') * 10 + (str[4] - '0');
double hour_angle = hour * 30 + min * 0.5;
double min_anlge = min * 6;
double res_angle = abs(hour_angle - min_anlge);
if (res_angle > 180) {
res_angle = 360 - res_angle;
}
return res_angle;
}
int main() {
cin >> T;
for (int t = 0; t < T; t++) {
vector<tuple<double, string>> arr;
; for (int i = 0; i < 5; i++) {
string str;
cin >> str;
arr.push_back({ time_angle(str), str });
}
sort(arr.begin(), arr.end());
double angle;
string str;
tie(angle, str) = arr[2];
cout << str << "\n";
}
return 0;
}
코드 설명
hh:mm 형식의 시간 정보를 인자로 받고 각도를 반환하는 함수 time_angle을 정의한다.
1. string형 hh와 mm을 아스키코드를 이용하여 int형으로 변환한다.
(각도 정보만 필요하므로, 12시 이상의 hh정보는 0시~ 11시로 치환한다.)
2. 시침의 각도는 0시 기준에서 1분마다 0.5도씩 이동한다. (1시간에 30도씩 이동)
3. 분침의 각도는 0분 기준에서 1분마다 6도씩 이동한다.
4. 시침과 분침의 각도 차를 절댓값으로 구하고, 그 차이가 180도 이상이라면 큰 각도이므로, 360을 빼서 작은 각도를 구한다.
위 과정으로 구한 각도를 hh:mm형식의 string과 함께 튜플로 묶어서 vector에 저장하고, sort 함수를 이용하여 정렬한다.
마지막으로, vector의 세번째 시간을 출력한다.
'Algorithm Problems > 구현' 카테고리의 다른 글
[백준/C++] 4447번: 좋은놈 나쁜놈 (0) | 2024.04.15 |
---|---|
[백준/C++] 1718번: 암호 (1) | 2024.04.06 |
[백준/Python] 17300번: 패턴 (1) | 2024.01.06 |
[백준/Python] 23349번: 졸업 사진 (0) | 2024.01.01 |
[백준/Python] 1969번: DNA (1) | 2023.11.20 |