프로그래머스 - 아날로그 시계 (java)

응큼한포도·2024년 4월 22일
1

코딩테스트

목록 보기
25/31
class Solution {
    public int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
        int startTime = toSec(h1, m1, s1);
        int endTime = toSec(h2, m2, s2);
        
        int num = endTime * 59/3600 + endTime * 719/43200 - startTime * 59/3600 - startTime * 719/43200;
        if (startTime >= 43200) {
            num += 1;
        }
        if (endTime >= 43200) {
            num -= 1;
        }
        if (startTime * 59 % 3600 == 0 || startTime * 719 % 43200 == 0) {
            num += 1;
        }

        return num;
    } 
    private static int toSec(int h, int m, int s) {
        return h * 3600 + m * 60 + s;
    }
    
}

// 초침이 시침이나 분침과 겹칩때
// 속도비 1/60 : 1/3600 : 1/ 60 ^ 2 * 24 = 60 ^ 2 : 60 ^ 1 : 1 = s : m : h
// 상대속도 초와 분 3600 - 60 초와 시  60 * 12 - 1 
// 그럼 1시간에 59번 초침과 분침, 12시간에 719번 초침과 시침이 만남
//  초침과 분침은 59 / 3600, 719 / 43200
// 12시 정각에만 초, 분, 시침이 겹치니까 1빼주자.

결국엔 시계는 주기운동이다. 그리고 주기는 12시마다 초기화가 된다고 보면된다. 그래서 결국엔 24시간동안 시계가 겹치는 순간은 정해져있다. 지금 시간이 언제인지는 중요하지 않다. 무조건 시계가 겹치는 순간이 절대적으로 정해져 있다고 생각하고 풀면된다.

그럼 모든걸 second의 기준으로 생각해보면 시침과 분침은 3600초에 59번 만나고 시침과 초침은 12시간에 719번 만나니까 이걸 비례식 이용해서 위 처럼 구해주자. 끝나는 시간까지 얼마나 겹쳤는지에 시작시간 까지 얼마나 겹쳤는지 빼면 그 사이에 얼마나 겹쳤는지 셀 수 있다.

이때 헷갈리는게 자칫 시작시간과 끝나는 시간의 관계가 있다고 생각할 수 있는데 침이 겹치는 시간은 무조건 절대적으로 고정되어 있어서 상관이 없다.

profile
미친 취준생

0개의 댓글