문제
초기 시각이 주어지고, 시간을 앞으로/뒤로 이동하거나 현재 시각을 출력하는 쿼리를 처리하라.
입력
초기 시각(시, 분, 초)과 쿼리 수 N, 이후 N개의 쿼리가 주어진다. 1: 초 더하기, 2: 초 빼기, 3: 현재 시각 출력.
출력
쿼리 3이 들어올 때마다 현재 시각을 시 분 초로 출력한다.
예제
| 입력 | 출력 |
|---|---|
0 0 0 3 1 100 3 2 50 | 0 1 40 |
풀이
시각을 초 단위로 통합 관리하고 모듈러 연산으로 범위를 유지한다.
- 초기 시각을 초 단위로 변환한다
- 쿼리 1은 초를 더하고 86400으로 나눈 나머지를 취한다
- 쿼리 2는 초를 빼고 음수이면 86400을 더한다
- 쿼리 3은 초를 시/분/초로 역변환하여 출력한다
핵심 아이디어: 시간을 초 단위로 통일하고 24시간(86400초)으로 모듈러 연산하면 날짜 경계가 자동 처리된다.
코드
#include <bits/stdc++.h>
using namespace std;
int main()
{
cin.tie(0)->sync_with_stdio(0);
int h, m, s, t, n, x, y;
cin >> h >> m >> s >> n;
t = 3600 * h + 60 * m + s;
for (int i = 0; i < n; i++)
{
cin >> x;
if (x == 1)
cin >> y, t = (t + y) % (24 * 60 * 60);
else if (x == 2)
{
cin >> y;
t = (t - y) % (24 * 60 * 60);
while (t < 0)
t += (24 * 60 * 60);
}
else if (x == 3)
cout << t / 3600 << ' ' << (t / 60) % 60 << ' ' << t % 60 << '\n';
}
}복잡도
- 시간: O(N)
- 공간: O(1)