문제 : https://www.acmicpc.net/problem/12840
[알고리즘풀이]
먼저, 문제를 푸는데 필요한 아이디어를 정리하겠습니다.
- 시계를 앞으로 돌린다는 뜻은 시간을 더해주는 것이고 시계를 뒤로 돌린다는 뜻은 시간을 빼준다는 뜻입니다.
- 모든 시간은 초 단위로 표현할 수 있다.
- 하루는 86400초이고, 우리는 24시간 단위로 답을 표현해야하므로, 하루가 넘어가는 시간에 대해서는 신경쓸 필요가 없다. 즉 현재 시간(초)= 현재시간(초) % 86400이 성립한다.
위의 3가지 사실을 이용해서, 현재 시간 h(시간) m(분) s(초)를 입력받으면 초 단위로 변환해 cur에 저장합니다.
그리고 3가지 쿼리에 대해 다음과 같이 수행합니다.
1) 시계를 앞으로 c초 만큼 돌린다.
c를 입력받고, 현재 시간(초) 에 더하고 % 86400을 취하면 현재 시간이 됩니다.
2) 시계를 뒤로 c로 만큼 돌린다.
c를 입력받고, 현재 시간(초) 에 뺍니다. 이때, 현재 시간이 음수가 된다면 86400을 계속 더해 양수로 바꿔줍니다.
3) 현재 시간을 출력하시오.
h = cur / 3600
m = (cur / 60) % 60
s = cur % 60 이 성립합니다.
이 문제는 시간을 초 단위로 다루면 간단하게 풀 수 있습니다.
#include<iostream>
#define day 86400
using namespace std;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
int h, m, s, cur, tc, x, y;
cin >> h >> m >> s >> tc;
cur = 3600 * h + 60 * m + s;
for (int i = 0; i < tc; i++) {
cin >> x;
if (x == 3)
cout << cur / 3600 << ' ' << (cur / 60) % 60 << ' ' << cur % 60 << '\n';
else if (x == 1) {
cin >> y;
cur = (cur + y) % day;
}
else {
cin >> y;
cur = (cur - y) % day;
while (cur < 0) {
cur += day;
}
}
}
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 5557 : 1학년 - travelbeeee (0) | 2019.11.03 |
---|---|
[BOJ] 1105 : 팔 - travelbeeee (0) | 2019.10.31 |
[BOJ] 12847 : 꿀 아르바이트 - travelbeeee (0) | 2019.10.31 |
[BOJ] 11778 : 피보나치 수와 최대공약수 - travelbeeee (0) | 2019.10.31 |
[BOJ] 16234 : 인구 이동 - travelbeeee (0) | 2019.10.30 |