SFPC/2022
2022 SFPC B1
열정아빠와아들
2023. 2. 16. 15:05
#include <iostream>
// 입력 : 시간 h, 분 m, 기준값 d
// 출력 : 현재 시간대의 각도가 주어진 사잇각(d)와 같다면 1, 아니면 0
int f (int h, int m, int d) // h = 3, m = 0
{
// t = h시와 m분을 분으로 환산 // t = 180
int t = h * 60 + m;
// t가 홀수면 시침의 회전수에 소수점이 붙기 떄문에 오답이 나오게 된다.
if (t % 2 == 1)
return 0;
// x = 시침이 몇도 도는지 저장(t / 2는 0.5를 분수로 바꾼 것)
// y = 분침이 몇도 도는지 저장
// z = x - y의 절댓값 저장
int x = (t / 2) % 360;
int y = (t * 6) % 360;
int z = abs(x - y);
// z가 180보다 큰것은 주어진 사잇각의 크기를 초과하므로
// 360에 z를 뺸 값을 z에 저장
if (z > 180)
z = 360 - z;
if (z == d)
// 현재 시간의 사잇각이 주어진 사잇각과
// 같은 것이므로 1 반환
return 1;
else
// 현재 시간의 사잇각이 주어진 사잇각과
// 같지 않은것이므로 0 반환
return 0;
}
int main()
{
// d = 사잇각
/// h, m = 시간과 분
// cnt = 개수
int d, h, m, cnt = 0;
scanf("%d", &d);
// 시간은 0시부터 11시까지 있으니
// h를 0부터 11까지 돌린다.
for (h = 0; h < 12; h++)
{
// 분은 0분부터 59분까지 있으니
// m을 0부터 59까지 돌린다.
for (m = 0; m < 60; m++)
{
// f함수에서 참이 나왔다는건 d와 같은 각이라는 뜻이므로
// cnt를 1 올려준다.
if (f(h, m, d) == 1) cnt++;
}
}
// d와 사잇각이 같은 시각의 개수 출력
printf("%d\n", cnt);
// 시간은 0시부터 11시까지 있으니
// h를 0부터 11까지 돌린다.
for (h = 0; h < 12; h++)
{
// 분은 0분부터 59분까지 있으니
// m을 0부터 59까지 돌린다.
for (m = 0; m < 60; m++)
{
// f함수에서 참이 나왔다는건 d와 같은 각이라는 뜻이므로
// 시각을 출력해준다.(%02d = 숫자 2개 고정적으로 출력, 한 자리 수는 앞에 0 추가 출력
// 예:출력값이 8이면 08이 출력된다.)
if (f(h, m, d) == 1) printf("%02d:%02d\n", h, m);
}
}
}