본문 바로가기
알고리즘 풀이/프로그래머스

[프로그래머스] 아날로그 시계 (Java)

by char_lie 2024. 5. 3.
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/250135

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

아날로그 시계 문제

초침이 시침과 분침과 만나는 횟수를 세는 문제

 

#사용 알고리즘

구현

반응형

📌문제 접근 포인트

1. 초를 기준으로 해서 시작 시간과 끝 시간까지 전부 탐색을 해주자.

2. 예시를 보면 시작 할 때 초침이 다른 침들과 겹칠 경우 알람이 울린다. 여기서 알람이 울리는 케이스는 0시와 12시 2가지가 존재한다. 이 케이스를 고려하자.

3. 원형 각도를 기준으로(360) 시,분,초를 표현해보자. 초는 1초당 6도, 분은 1초당 6 / 60도씩, 시간은 6 / 60*12도씩 늘어나는 형태고, 이때 각도가 0~360도 모두 측정이 되어야하므로 각도가 360이 되었을때 0으로 초기화 되지않게 값을 설정해주자.

4. 요구 조건에 맞게 초침과 시침이 만났을때, 초침과 분침이 만났을 때 횟수를 증가시키고, 만약 그 케이스가 3개가 모두 겹치는 경우면 1번만 올라가도록 구성해주자.

⚙ 내가 푼 정답 코드

class Solution {
    public static double calc(double x){
        // % 360에 의해 0이 되어도 360이 되도록 만들기
        if (x == 0){
            return 360;
        }
        return x;
    }
    
    public int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
        int answer = 0;
        double start = h1 * 3600 + m1 * 60 + s1;
        double end = h2 * 3600 + m2 * 60 + s2;

        if (start == 0 || start == 12 * 3600) {
            answer += 1;
        }

        while (start < end) {
            // 각도를 기준으로 계산
            double h = start / 120 % 360;
            double m = start / 10 % 360;
            double s = start * 6 % 360;
            // 다음 각도 계산
            double nh = calc((start + 1) / 120 % 360);
            double nm = calc((start + 1) / 10 % 360);
            double ns = calc((start + 1) * 6 % 360);

            if (s < h && nh <= ns) { // 초침과 시침이 만나면
                answer += 1;
            }
            if (s < m && nm <= ns) { // 초침과 분침이 만나면
                answer += 1;
            }
            if (ns == nh && nh == nm) { // 초침, 시침, 분침이 모두 겹치면
                answer -= 1;
            }

            start += 1;
        }

        return answer;
    }
}
반응형

댓글