[PCCP 기출문제] 3번 / 아날로그 시계

[PCCP 기출문제] 3번 / 아날로그 시계

시침, 분침, 초침이 있는 아날로그시계가 있습니다. 시계의 시침은 12시간마다, 분침은 60분마다, 초침은 60초마다 시계를 한 바퀴 돕니다. 따라서 시침, 분침, 초침이 움직이는 속도는 일정하며 각각 다릅니다. 이 시계에는 초침이 시침/분침과 겹칠 때마다 알람이 울리는 기능이 있습니다. 당신은 특정 시간 동안 알람이 울린 횟수를 알고 싶습니다.

다음은 0시 5분 30초부터 0시 7분 0초까지 알람이 울린 횟수를 세는 예시입니다.

ex1-1.png
  • 가장 짧은 바늘이 시침, 중간 길이인 바늘이 분침, 가장 긴 바늘이 초침입니다.
  • 알람이 울리는 횟수를 세기 시작한 시각은 0시 5분 30초입니다.
  • 이후 0시 6분 0초까지 초침과 시침/분침이 겹치는 일은 없습니다.
ex1-2.png
  • 약 0시 6분 0.501초에 초침과 시침이 겹칩니다. 이때 알람이 한 번 울립니다.
  • 이후 0시 6분 6초까지 초침과 시침/분침이 겹치는 일은 없습니다.
ex1-3.png
  • 약 0시 6분 6.102초에 초침과 분침이 겹칩니다. 이때 알람이 한 번 울립니다.
  • 이후 0시 7분 0초까지 초침과 시침/분침이 겹치는 일은 없습니다.

0시 5분 30초부터 0시 7분 0초까지는 알람이 두 번 울립니다. 이후 약 0시 7분 0.584초에 초침과 시침이 겹쳐서 울리는 세 번째 알람은 횟수에 포함되지 않습니다.

https://school.programmers.co.kr/learn/courses/30/lessons/250135


public class Main {

    public static void main(String[] args) {

        int h1 = 1;
        int h2 = 1;

        int m1 = 5;
        int m2 = 5;

        int s1 = 5;
        int s2 = 6;


        var reuslt = solution(h1, m1, s1, h2, m2, s2);

        System.out.println(reuslt);
    }

    public static int solution_(int h1, int m1, int s1, int h2, int m2, int s2) {
        int result = 0;

        int startToSec = h1 * 3600 + m1 * 60 + s1;
        int endToSec = h2 * 3600 + m2 * 60 + s2;

        double secStickSecDeg = (double) 360 / 60;
        double minStickSecDeg = (double) 360 / 3600;
        double timeStickSecDeg = (double) 360 / (3600 * 12);

        double secDeg = secStickSecDeg * startToSec % 360;
        double minDeg = minStickSecDeg * startToSec % 360;
        double timeDeg = timeStickSecDeg * startToSec % 360;

        double oldSecDeg = secStickSecDeg * startToSec;
        double oldMinDeg = minStickSecDeg * startToSec;
        double oldTimeDeg = timeStickSecDeg * startToSec;

        while (startToSec != endToSec + 1) {

            int displayTime = startToSec / 3600;
            int displayMin = startToSec % 3600 / 60;
            int displaySec = startToSec % 3600 % 60;

            System.out.println(displayTime + " 시 " + displayMin + " 분 " + displaySec + " 초 ");
            System.out.println(timeDeg + " 시 " + minDeg + " 분 " + secDeg + " 초 ");
            System.out.println();

            if (secDeg == 0) {
                secDeg = 360;
            }

            if (minDeg == 0) {
                minDeg = 360;
            }

            if (timeDeg == 0) {
                timeDeg = 360;
            }


            if ((oldSecDeg <= oldMinDeg && secDeg > minDeg) || (oldSecDeg <= oldTimeDeg && secDeg > timeDeg)) {

                result++;
            }

            oldSecDeg = secDeg;
            oldMinDeg = minDeg;
            oldTimeDeg = timeDeg;

            secDeg = secStickSecDeg * startToSec % 360;
            minDeg = minStickSecDeg * startToSec % 360;
            timeDeg = timeStickSecDeg * startToSec % 360;

            startToSec++;
        }

        return result;
    }

    public static int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
        int result = 0;

        int startToSec = h1 * 3600 + m1 * 60 + s1;
        int endToSec = h2 * 3600 + m2 * 60 + s2;

        double secStickSecDeg = (double) 360 / 60;
        double minStickSecDeg = (double) 360 / 3600;
        double timeStickSecDeg = (double) 360 / (3600 * 12);


        double initSecDeg = secStickSecDeg * startToSec % 360;
        double initMinDeg = minStickSecDeg * startToSec % 360;
        double initTimeDeg = timeStickSecDeg * startToSec % 360;

        if (initTimeDeg == initSecDeg || initMinDeg == initSecDeg) {
            result++;
        }

        while (startToSec != endToSec) {
            double secDeg = secStickSecDeg * startToSec % 360;
            double minDeg = minStickSecDeg * startToSec % 360;
            double timeDeg = timeStickSecDeg * startToSec % 360;

            double nextSecDeg = secStickSecDeg * (startToSec + 1) % 360;
            double nextMinDeg = minStickSecDeg * (startToSec + 1) % 360;
            double nextTimeDeg = timeStickSecDeg * (startToSec + 1) % 360;

            if (nextSecDeg == 0) {
                nextSecDeg = 360;
            }

            if (nextMinDeg == 0) {
                nextMinDeg = 360;
            }

            if (nextTimeDeg == 0) {
                nextTimeDeg = 360;
            }

            if (secDeg < minDeg && nextSecDeg >= nextMinDeg && secDeg < timeDeg && nextSecDeg >= nextTimeDeg) {

                if (nextSecDeg == nextMinDeg) {

                    result++;
                    startToSec++;
                    continue;
                }

            }

            if (secDeg < minDeg && nextSecDeg >= nextMinDeg) {
                result++;
            }

            if (secDeg < timeDeg && nextSecDeg >= nextTimeDeg) {
                result++;
            }

            startToSec++;
        }

        return result;
    }


}