문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/250135





제한 사항

입출력 예




풀이
class Solution {
private static final int HOUR_MOV = 1, MIN_MOV = 12, SEC_MOV = 720;
// max - 43200
public int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
int answer = 0;
int timeToSec = (h2 - h1) * 3600 + (m2 - m1) * 60 + (s2 - s1);
int sec = SEC_MOV * s1;
int min = MIN_MOV * (m1 * 60 + s1);
int hour = HOUR_MOV * ((h1 >= 12 ? h1 - 12 : h1) * 3600 + m1 * 60 + s1);
while (--timeToSec >= 0) {
boolean isHourAlarm = false, isMinAlarm = false;
if (sec <= hour && hour + HOUR_MOV < sec + SEC_MOV) isHourAlarm = true;
if (sec <= min && min + MIN_MOV < sec + SEC_MOV) isMinAlarm = true;
if (isHourAlarm || isMinAlarm) {
if (isHourAlarm && isMinAlarm) {
if (hour == min || hour + HOUR_MOV == min + MIN_MOV) answer++;
else answer += 2;
}
else answer++;
}
hour = (hour == 43199 ? 0 : hour + HOUR_MOV);
min = (min == 43188 ? 0 : min + MIN_MOV);
sec = (sec == 42480 ? 0 : sec + SEC_MOV);
}
if (sec == min || sec == hour) answer++;
return answer;
}
}
후기
오랜만에 2단계를 풀어서 그런가 푸는데 3시간이나 걸렸다... 두 달 정도 안 했다고 이렇게 풀기 힘들어지는건가...
이 문제의 관건은 소수로 푸는 대신 정수로 바꿔서 푸는 것이다. 시간은 시분초 모두 어쨌든 한바퀴를 돌아야 하지만 도는 주기가 다른거고 대신 하루가 24시간이지만 시계로는 12시간까지밖에 표현을 못하기 때문에 그 점도 고려해야 한다. 그리고 시작 시간과 끝나는 시간 처리도 잘 해주면 된다. 진짜 관건인 부분은 시침과 분침이 초침과 언제 만나는지 처리를 하는 부분인데 참고로 정확히 겹치는 일이 위의 코드에서는 일어날 수도 있고 아닐 수도 있기 때문에 1초간 범위를 지정해서 그 범위 안에 서로의 순서가 바뀌면 어쨌든 겹치는 일이 있었던 것이니까 이런 식으로 어림잡아 풀어도 된다.
풀이 힌트로는 굳이 둥근 시계 모양과 12시간이 최대라고 생각하지 않아도 된다는 점. x축에서 1이 최대라고 치고 그 사이에서 시분초가 움직인다고 한번 생각해보자. 답과 바로 연결되는 것은 아니지만 생각의 전환을 할 수 있다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
| [프로그래머스][Java][Lv. 2] 택배상자 (0) | 2023.12.29 |
|---|---|
| [프로그래머스][Java][Lv. 1] [PCCE 기출문제] 9번 / 이웃한 칸 (0) | 2023.12.27 |
| [프로그래머스][Java][Lv. 1] [PCCE 기출문제] 10번 / 데이터 분석 (0) | 2023.12.26 |
| [프로그래머스][Java][Lv. 1] [PCCP 기출문제] 1번 / 붕대 감기 (0) | 2023.12.24 |
| [프로그래머스][JAVA][Lv. 2] 숫자 변환하기 (0) | 2023.11.05 |