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);
        }
    }
}