문제 분석
https://school.programmers.co.kr/learn/courses/30/lessons/250135
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
시작 시간 ~ 종료 시간까지 초침이 분침 혹은 시침과 만나는 횟수를 리턴해주면 되는 문제다. 단, 초침이 분침,시침과 동시에 만나는 경우는 1번으로 센다.
시간을 x hour y min z sec 으로표현해보면
시침의 위치는 x(x>=12 ? x-=12) + y/60 + z/3600
분침의 위치는 y/5 + z/300
초침의 위치는 z/5 이다.
초침과 분침이 겹치려면 z/5 = y/5 +z/300 을 y min에 만족하는 z를 찾으면 되고
초침과 시침이 겹치려면 z/5 = x(x>=12 ? x-=12) + y/60 + z/3600 을 만족하는 z를 찾으면 된다.
이때 이 z가 60보다 작으면 초침과 해당 침은 만나게 되는 것이다.
여기서 주의할 점은
시작 시간 , 분인 경우 시작 초가 정해져 있다. (종료 시간,분도 마찬가지다)
따라서, z가 시작 초 보다 커야 한다.
(또, 시작과 종료 시간의 시간,분이 같은 경우 z가 종료 초보다 작아야 한다.)
종료 시간의 경우에도 종료 초보다 z가 작아야 한다.
그리고, 시침과 분침 초침 모두가 동일하게 만나는 경우가 존재하기에 이런 경우 굳이 시침과 초침이 만나는 초를 count할 필요가 없다. 이를 구한 z값을 기준으로 비교하면 된다. (난 소숫점 4째 자리까지만 반영해서 비교했다.)
코드
class Solution {
public int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
int answer = 0;
// x hour y min z sec
// x(x>=12 ? x-=12) + y/60 + z/3600
// y/5 + z/300 is min tick
// z/5 is sec tick
for(int hour = h1; hour<=h2 ; hour ++){
int startMin = hour==h1 ? m1 : 0;
int endMin = hour == h2 ? m2 : 59;
for(int min = startMin; min <= endMin; min ++){
//59z=60y
double z = (double)60*min/59;
// System.out.println("sec to min z : "+z);
int secToTime = (int)(z*10000);
if(hour == h1 && min == m1){
if(z< 60 && s1 <= z){
if(hour==h2 && min==m2 && z > s2)
continue;
answer++;
}
}else if(hour == h2 && min == m2){
if(z<60 && z <= s2){
answer++;
}
}else if(z < 60){
answer++;
}
int x = hour >= 12 ? hour-12 : hour;
// 3600x +60y +z = 720z
// 3600x+60y = 719z
z = (double)(3600*x + 60*min)/719;
// System.out.println("sec to hour z : "+z);
int secToHour = (int)(z*10000);
//ex) 0hour 30 min -> 1800
boolean isAllMatchingTick = secToTime == secToHour;
if(isAllMatchingTick){
//already checked in min to sec
continue;
}
if(hour == h1 && min == m1){
if(z< 60 && s1 <= z){
if(hour==h2 && min==m2 && z > s2)
continue;
answer++;
}
}else if(hour == h2 && min == m2){
if(z<60 && z <= s2){
answer++;
}
}else if(z < 60){
answer++;
}
}
}
return answer;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
연속된 부분 수열의 합 (0) | 2024.10.18 |
---|---|
두 원 사이의 정수 쌍 (0) | 2024.10.18 |
도넛과 막대 그래프 [JAVA] (2) | 2024.10.17 |
[PCCP 기출문제] 2번 / 석유 시추 [JAVA] (1) | 2024.10.16 |
[PCCP 기출문제] 3번 / 충돌위험 찾기 [JAVA] (0) | 2024.10.16 |