문제 : https://www.acmicpc.net/problem/12840


[알고리즘풀이]

먼저, 문제를 푸는데 필요한 아이디어를 정리하겠습니다.

  1. 시계를 앞으로 돌린다는 뜻은 시간을 더해주는 것이고 시계를 뒤로 돌린다는 뜻은 시간을 빼준다는 뜻입니다.
  2. 모든 시간은 초 단위로 표현할 수 있다.
  3. 하루는 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;
			}
		}
	}
}

 

+ Recent posts