[PCCP 기출문제] 3번 / 아날로그 시계
시침, 분침, 초침이 있는 아날로그시계가 있습니다. 시계의 시침은 12시간마다, 분침은 60분마다, 초침은 60초마다 시계를 한 바퀴 돕니다. 따라서 시침, 분침, 초침이 움직이는 속도는 일정하며 각각 다릅니다. 이 시계에는 초침이 시침/분침과 겹칠 때마다 알람이 울리는 기능이 있습니다. 당신은 특정 시간 동안 알람이 울린 횟수를 알고 싶습니다.
다음은 0시 5분 30초부터 0시 7분 0초까지 알람이 울린 횟수를 세는 예시입니다.
- 가장 짧은 바늘이 시침, 중간 길이인 바늘이 분침, 가장 긴 바늘이 초침입니다.
- 알람이 울리는 횟수를 세기 시작한 시각은 0시 5분 30초입니다.
- 이후 0시 6분 0초까지 초침과 시침/분침이 겹치는 일은 없습니다.
- 약 0시 6분 0.501초에 초침과 시침이 겹칩니다. 이때 알람이 한 번 울립니다.
- 이후 0시 6분 6초까지 초침과 시침/분침이 겹치는 일은 없습니다.
- 약 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;
}
}