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

정진욱·2024년 1월 29일
0

알고리즘

목록 보기
4/4

문제 풀이가 빡세다..

아날로그 시계

처음에 설마 각도로 풀겠어라고 생각해서 다른 방식 찾다가 결국 각도로 했는데 너무 복잡했다.
그래서 풀이를 찾아봤는데 진짜 깔끔하게 푼 코드가 있어서 공유해본다.

class Solution {
    public int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
        int answer = -1;
        
        //시간 분 초 를 초로 변환한다.
        int start = toSecond(h1,m1,s1);
        int end = toSecond(h2,m2,s2);
        
        //끝나는 시간까지는 몇번 울리는지 - 시작 시간까지는 몇번울리는지 + 현재 시간에 울리는지
        answer = cal(end) - cal(start) + (alramNow(start)? 1:0); 
        // 현재 시간도 빼버렸기에 현재 시간에 울리는지 확인하고 더해준다.
        															
        
        return answer;
    }
    static int cal(int time){
        int sm = time*59/3600; //분심이 한 바퀴 도는데 초침이랑 59번 겹친다
        					   // 그럼 1번 울리는데 3600/59 초마다 울린다고 볼 수 있다.
                               // 그렇다면 time에 59를 곱하고 3600으로 나눠주면 몇번 울리는지 알 수 있다.
                               // 쉽게 말해서 만약 time == 100 이라면 1초에 59/3600 번 울리는데 
                               // 59 * 100 을 3600으로 나눠주면 5900/3600 = 1.xxxx 이다. 
                               // 즉 1번 울린다는 것!
                               
        int sh = time*719/43200;  // 위와 마찬가지로 시침이 한 바퀴 도는데는 43200초다.
        						 // 60초에 1번 겹치고 60초가 60(분) * 12(시간) 번 겹친다고 볼 수 있다.
                                 // 시침이 한바퀴 도는데 그럼 720-1 = 719 번 겹친다.
                                 // 43200/719 초 마다 겹친다는 것!
        
        
        
        int a = 43200 <= time ? 2 : 1; // 12:00:00 가 몇번 나오는지 계산해서 빼준다. 
        							  // 시침 분침 둘다 더해놨으니 빼야한다.
        							  // 43200 즉 시간이 12시 이상이면 2번 나온다.
                                      // 아니면 1번
                                      
        return sm+sh - a;
    }
    
    static int toSecond(int h,int m,int s){
        int k = h*3600+m*60+s;
        return k;
    }
    static boolean alramNow(int time){
        return time*59%3600==0 || time*719%43200==0; // 현재시간에 알람이 울리는지 체크한다.
    }
}

원본 풀이
이해가 잘 되지 않는다면 원본 풀이도 같이 보자

profile
웹 개발자

1개의 댓글

comment-user-thumbnail
2024년 11월 9일

분심이 한 바퀴 도는데 초침이랑 59번 겹친다
선생님 이거 왜 59번인가요?? 60번 아닌가요??

풀이 이해하고 싶어서 질문 드립니다.

답글 달기