시침,분침,초건이 만나는 조건을 잘 생각하면 수학적으로 해결이 가능합니다.
기본적으로 1분에 초침이 한바퀴를 돌며 시침,분침 두개를 한번씩 만난다고 가정합니다.
그런데 잘생각해보면 59분 -> 00분으로 갈때는 초침과 분침이 만나지 않습니다. 59분인 경우 초침이 한바퀴를 돌아서 00분이 되는 경우에만 만나기 때문입니다.
같은 원리로 시침,초침또한 11시->12시로 이동할때는 겹치지 않습니다.
즉 59분->00분으로 갈때마다 (한시간마다) 만나는 횟수를 1씩 빼주고 12시 00분인 경우에만 특이처리를 해주면 됩니다.
[조금더 쉬운 설명]
0시0분0초 ~ 23시59분59초까지 시,분,초침이 만나는 횟수를 구한다생각해봅시다.
단순하게 하루는 24*60 = 1440분입니다. 즉, 1분당 시,분침이 초침과 1번씩 만나므로
1440 * 2 = 2880번 만난다고 가정해봅시다.
방금 말한대로 59분 -> 00분으로 갈때 분침,초침은 만나지 않습니다. 따라서 -24의 카운트를 해줍니다.
또 11시59분 -> 12시 와 23시59분 -> 00시 로갈때 시침,초침은 만나지 않습니다. 따라서 -2의 카운트를 해줍니다.
0시0분0초 , 12시0분0초는 시-분-초 침이 만나서 카운트를 하나로만 치게 됩니다. 따라서 -2의 카운트를 해줍니다.
따라서 마지막 예제의 답은 2880 - 28 = 2852가되게 됩니다.
고려해야할 점은 시작 시간과 끝나는 시점이 유동적이라는 점입니다.
따라서 저는 그냥 0시0분0초부터 h1:m1:s1 까지 만나는 횟수와 0시0분0초부터 h2:m2:s2까지 만나는 횟수를 구해서 빼주는 형식으로 구해줬습니다.
이경우 시작하는 초는 세면 안되므로 시작하는 초가 카운트에 세지는 0시0분0초와 12시0분0초만 예외처리해주면 조금 더 쉽게 해결할 수 있습니다.
최곱니다👍 설명 감사합니다~
천재이신가요?
저 궁금한게 (11시59분 -> 12시 와 23시59분 -> 00시 로갈때 시침,초침은 만나지 않습니다. 따라서 -2의 카운트를 해줍니다.) 에 대해서 왜 -2를 하는 건가요? 각각 h가0보다 클때 -1을 일차적으로 해주고 12보다 클때 2차적으로 -1을 하는게 맞지 않나요?
그리고 문제에서 23시에서 00시로 가는건 고려하지 않았다고 하는데 왜 이렇게 나오는 건가요?
Gosu
(h60+m)2 가 이해가 안되시는 분들을 위해 추가적으로 작성해드리면,
시침하고 분침은 65.454545분에 한번 겹치므로 1시간에는 대략 60/65.454545.... = 0.91666 만큼 겹칩니다.
하지만 코드는 1시간에 2의 겹침횟수로 계산했기 때문에 이를 보정할 필요가 있어요
따라서 (2-0.9166667) = 1.083333...(보정 값)
입니다.
시침과 초침, 분침과 초침은 각각 1.0014, 1.0182 분마다 겹치기 때문에 정확하게 계산해보면
(2h * 60 + 2.0222m - 1.0833h) 여야 되지만 대략적으로 소수점자리 무시하고
ret = (h60 +m) *2 - h가 되는겁니다.
저는 이렇게 이해했네요