🌞Algorithm/🔥Baekjoon

[Baekjoon] 8989_시계

뿌야._. 2024. 7. 24. 14:45
문제(출처: https://www.acmicpc.net/problem/8989)

< 시계 >

 

문제 풀이 

 

시침 각도와 분침 각도를 구한다.

시침 각도 = 시침 * 30 + 분침 * 0.5
분침 각도 = 분침 * 6    

 

시침과 분침이 이루는 각도는 아래와 같이 3가지 방법으로 구한다. 

1) 시침 + 360 - 분침

2) 분침 + 360 - 시침

3) 시침 - 분침

 

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class _8989_ { // 시계
	static class Clock implements Comparable<Clock> {
		private String time;
		private double angle;

		public Clock(String time, double angle) {
			this.time = time;
			this.angle = angle;
		}

		@Override
		public int compareTo(Clock o) {
			if (this.angle == o.angle) {
				return this.time.compareTo(o.time);
			}
			return Double.compare(this.angle, o.angle);
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		int T = Integer.parseInt(bf.readLine());
		for (int i = 0; i < T; i++) {
			st = new StringTokenizer(bf.readLine());
			Clock answer[] = new Clock[5];

			for (int j = 0; j < 5; j++) {
				String time = st.nextToken();
				String arr[] = time.split(":");

				double h = Double.parseDouble(arr[0]);
				double m = Double.parseDouble(arr[1]);
				double result = Integer.MAX_VALUE;

				if (h > 12) {
					h -= 12;
				}
				h = h * 30 + 0.5 * m;
				m *= 6;
				result = Math.min((360 - m) + h, m + (360 - h));
				result = Math.min(result, Math.abs(m - h));
				answer[j] = new Clock(time, result);
			}
			Arrays.sort(answer);
			bw.write(answer[2].time + "\n");
		}
		bw.flush();
	}
}
변수)
T : 테스트 케이스의 개수
answer : Clock을 저장하는 배열
h, m : 시침, 분침
result : 시침과 분침이 형성하는 각도 중 작은 각도

 

Clock

시간과 시침과 분침이 형성하는 각도를 변수로 가진다. 정렬할 때 각도가 작은 값을 우선순위로 정렬하며, 각도가 같다면 시간이 빠른 것을 우선으로 한다.

 

Main 

테스트 케이스 개수를 입력받는다. 테스트 케이스 수만큼 다음 과정을 반복한다.

1) 시간 데이터를 입력받아 시와 분을 나눈다. 

2) 12시를 넘었다면 12를 빼준다.

3) 시침이 이루는 각도는 1시간에 30도 1분에 0.5도를 움직이므로  h * 30 + 0.5 * m이 된다.

4) 분침이 이루는 각도는 1분에 6도를 움직이므로 m * 6이 된다.

5) 시침과 분침이 이루는 각도를 3가지 경우로 계산하여 그중에서 가장 작은 값을 구한다.

6) 배열에 각도와 시간을 저장한다.

7) 배열 정렬 후 중간 값의 시간을 출력한다.



 

'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글

[Baekjoon] 10799_쇠막대기  (0) 2024.07.26
[Baekjoon] 15705_단어 찾기  (1) 2024.07.25
[Baekjoon] 9753_짝 곱  (1) 2024.07.23
[Baekjoon] 3231_카드놀이  (0) 2024.07.22
[Baekjoon] 15595_정답 비율 계산하기  (0) 2024.07.19