1
+ class SB_250135 {
2
+ private static boolean overlapHour (Time cur , Time nxt ) {
3
+ if (cur .dh > cur .ds && nxt .dh <=nxt .ds ) return true ;
4
+ return cur .ds == 354 && cur .dh > 354 ;
5
+ }
6
+ private static boolean overlapMin (Time cur , Time nxt ) {
7
+ if (cur .dm > cur .ds && nxt .dm <=nxt .ds ) return true ;
8
+ return cur .ds == 354 && cur .dm > 354 ; // 초침이 정각으로 갈때 0도 처리
9
+ }
10
+ public static int solution (int h1 , int m1 , int s1 , int h2 , int m2 , int s2 ) {
11
+ int startTime = new Time (h1 , m1 , s1 ).getSecond ();
12
+ int endTime = new Time (h2 , m2 , s2 ).getSecond ();
13
+
14
+ int cnt = 0 ;
15
+ for (int i = startTime ; i < endTime ; i ++) {
16
+ Time cur = new Time (i );
17
+ Time nxt = new Time (i + 1 );
18
+
19
+ boolean isMinRing = overlapMin (cur , nxt );
20
+ boolean isHourRing = overlapHour (cur , nxt );
21
+
22
+ if (isMinRing && isHourRing ){ // 시침 분침 모두 겹쳤을때
23
+ if (nxt .dh == nxt .dm ) cnt ++; // 시침분침의 위치가 같으면 한번만 카운트
24
+ else cnt +=2 ;
25
+ } else if (isMinRing || isHourRing ) cnt ++;
26
+ }
27
+ if (startTime ==0 || startTime ==43200 ) cnt ++; // 예외처리: 처음에 시분초 모두 같이 있을 경우(정오, 정각)
28
+ return cnt ;
29
+ }
30
+
31
+ static class Time {
32
+ int h , m , s ;
33
+ double dh , dm , ds ;
34
+
35
+ public Time (int h , int m , int s ) {
36
+ this .h = h ;
37
+ this .m = m ;
38
+ this .s = s ;
39
+ setDegrees ();
40
+ }
41
+
42
+ public Time (int s ) {
43
+ this .h = s / 3600 ;
44
+ this .m = (s % 3600 ) / 60 ;
45
+ this .s = (s % 3600 ) % 60 ;
46
+ setDegrees ();
47
+ }
48
+
49
+
50
+ private int getSecond () {
51
+ return h * 3600 + m * 60 + s ;
52
+ }
53
+
54
+ private void setDegrees () {
55
+ this .dh = (h % 12 ) * 30d + m * 0.5 + s * (0.5 / 60 );
56
+ this .dm = m * 6 + s * 0.1 ;
57
+ this .ds = s * 6 ;
58
+ }
59
+ }
60
+ }
0 commit comments