![[프로그래머스/JAVA] 250135번 아날로그 시계](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEpAUw%2FbtsKvpmpkqS%2FzAFYIrlLGRS6azbpJNAMYk%2Fimg.png)

[프로그래머스/JAVA] 250135번 아날로그 시계Coding Test/Programmers2024. 11. 2. 20:12
문제
더보기
문제 링크
[PCCP 기출문제] 3번 / 아날로그 시계
https://school.programmers.co.kr/learn/courses/30/lessons/250135
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
시침, 분침, 초침이 있는 아날로그시계가 있습니다.
시계의 시침은 12시간마다, 분침은 60분마다, 초침은 60초마다 시계를 한 바퀴 돕니다.
따라서 시침, 분침, 초침이 움직이는 속도는 일정하며 각각 다릅니다.
이 시계에는 초침이 시침/분침과 겹칠 때마다 알람이 울리는 기능이 있습니다.
당신은 특정 시간 동안 알람이 울린 횟수를 알고 싶습니다.
알람이 울리는 횟수를 센 시간을 나타내는 정수 h1, m1, s1, h2, m2, s2가 매개변수로 주어집니다.
이때, 알람이 울리는 횟수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 0 ≤ h1, h2 ≤ 23
- 0 ≤ m1, m2 ≤ 59
- 0 ≤ s1, s2 ≤ 59
- h1시 m1분 s1초부터 h2시 m2분 s2초까지 알람이 울리는 횟수를 센다는 의미입니다.
- h1시 m1분 s1초 < h2시 m2분 s2초
- 시간이 23시 59분 59초를 초과해서 0시 0분 0초로 돌아가는 경우는 주어지지 않습니다.
문제풀이
접근 방법
- 침마다 시계를 도는 속도가 다르다
- 시침은 12시간에 360° 를 돈다. 초속 (1/120)°, 각도 계산시 현재 시간(초) 에 %43200(초)(12시간) 를 해준다.
- 분침은 60분에 360° 를 돈다. 초속 (1/10)°, 각도 계산시 현재 시간(초) 에 %3600(초)(60분) 를 해준다
- 초침은 60초에 360° 를 돈다. 초속 6°, 각도 계산시 현재 시간(초) 에 %60(초) 를 해준다
- 침과 침이 만날 때 알람이 울린다 -> 세 침이 같이 겹치면 알람이 한번 울린다.
- 각도는 0~360° 이지만 360° 가 0°으로 계산될 수 있으므로 범위 계산할 때 유의한다.
코드
public class P_250135 {
public static int solution(int h1, int m1, int s1, int h2, int m2, int s2) {
int count = 0;
int startTime = h1*3600 + m1*60 + s1;
int endTime = h2*3600 + m2*60 + s2;
// 아래 겹침 계산 기준이 시작순간은 포함하지 않는다.
// 시작 시각이 0시 0분 0초 혹은 12시 0분 0초일 경우 시분초침이 겹치므로 +1 더해준다.
if(startTime==0 || startTime==43200) {
count++;
}
// 시분초침의 각도 저장 (현재, 현재+1)
double degreeCurrentHour, degreeCurrentMinute, degreeCurrentSecond, degreeNextHour, degreeNextMinute, degreeNextSecond;
// 현재 시간(초) 를 각 침별 한바퀴 기준으로 변환
int hourTime, minuteTime, secondTime;
while (startTime<endTime) {
// 침별로 한바퀴 기준으로 현재 시각을 계산
// 시침 -> 12시간(43200초)에 한바퀴 돈다.
hourTime = startTime%43200;
// 분침 -> 60분(3600초)에 한바퀴 돈다.
minuteTime = startTime%3600;
// 초침 -> 60초에 한바퀴 돈다.
secondTime = startTime%60;
// 현재 침 각도 계산
// 12시 -> 360도 | 1초 -> (1/120)도
degreeCurrentHour = hourTime/120d;
// 60분 -> 360도 | 1초 -> (1/10)도
degreeCurrentMinute = minuteTime/10d;
// 60초 -> 360도 | 1초 -> 6도
degreeCurrentSecond = (startTime%60)*6;
// 현재+1 초 각도 -> 0으로 바뀌면 360으로 변환
degreeNextHour = ((hourTime+1)/120d == 0) ? 360 : (hourTime+1)/120d;
degreeNextMinute = ((minuteTime+1)/10d == 0) ? 360 : (minuteTime+1)/10d;
degreeNextSecond = ((secondTime+1)*6 == 0) ? 360 : (secondTime+1)*6;
// 초침이 이동한 범위에 시침의 범위가 있는 경우
if(degreeCurrentSecond<degreeCurrentHour && degreeNextHour<=degreeNextSecond) {
count += 1;
}
// 초침이 이동한 범위에 분침의 범위가 있는 경우
if(degreeCurrentSecond<degreeCurrentMinute && degreeNextMinute<=degreeNextSecond) {
count += 1;
}
// 시분초침 셋이 겹친경우 알람은 한번만 울리기 때문에 -1
if (degreeNextSecond==degreeNextMinute && degreeNextSecond==degreeNextHour) {
count -= 1;
}
startTime++;
}
return count;
}
}
반응형
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스/JAVA] 258711번 도넛과 막대 그래프 (0) | 2024.11.06 |
---|---|
[프로그래머스/JAVA] 340211번 충돌위험 찾기 (3) | 2024.11.04 |
[프로그래머스/JAVA] 340212번 퍼즐 게임 챌린지 (0) | 2024.10.31 |
[프로그래머스/JAVA] 250121번 데이터 분석 (1) | 2024.10.31 |
[프로그래머스/JAVA] 250125번 이웃한 칸 (1) | 2024.10.30 |

@dundun213 :: dundun213 님의 블로그
dundun213 님의 블로그 입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!