문제
아날로그 시계에서 시침과 분침이 정확히 일직선(180도)을 이루는 시각이 존재하는지 판별하는 문제다. 분침은 1분에 6도, 시침은 1분에 0.5도 이동하므로 둘의 상대 속도는 5.5도/분이며, 시침과 분침이 일직선이 되는 주기는 720/11분이다.
입력
- 여러 줄에 걸쳐 정수 n이 주어진다 (EOF까지).
출력
- n이 6의 배수이면
Y, 그렇지 않으면N을 출력한다.
예제
| 입력 | 출력 |
|---|---|
6 | Y |
5 | N |
12 | Y |
풀이
시침과 분침이 일직선이 되는 조건을 수학적으로 분석하면 n이 6의 배수인지 확인하는 단순한 판별식으로 귀결된다.
- 분침의 각도: 분침은 분 단위로 6도씩 회전한다.
- 시침과 분침의 각도 차이가 180도가 되려면 특정 조건이 필요하다.
- n분 후 분침 각도는
6n도, 시침 각도는0.5n도 이며, 두 침이 180도 차이가 나면 일직선이 된다. - 분석 결과 n이 6의 배수일 때만 정수 시각에 일직선이 성립한다.
핵심 아이디어: 시침과 분침이 일직선(180도)이 되는 시각은 매 720/11분마다 발생하지만, 문제 조건에서 n이 6의 배수인지만 확인하면 된다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
int n;
while (cin >> n)
{
if (n % 6)
cout << "N" << "\n";
else
cout << "Y" << "\n";
}
}복잡도
- 시간: O(Q) — Q는 입력 쿼리 수 (각 쿼리를 O(1)에 처리)
- 공간: O(1)