1408번: 24
문제 )
도현이는 Counter Terror Unit (CTU)에서 일하는 특수요원이다. 도현이는 모든 사건을 정확하게 24시간이 되는 순간 해결하는 것으로 유명하다. 도현이는 1시간 만에 범인을 잡을 수 있어도 잡지 않는다. 정확하게 24시간이 되는 순간이 아니면 잡지 않는 CTU 특수요원이다.
2008년 3월 3일 월요일, CTU는 새학기에 맞춰 핵폭탄을 날리겠다는 테러 정보를 입수했다. CTU에서는 특수요원 도현이에게 이 임무를 맡겼다. CTU의 프로그래머 준규는 이 사건의 배후가 김선영이란 것을 해킹을 통해 밝혀내었다.
도현이는 선영이를 임무를 시작한지 정확하게 24시간이 되는 순간에 잡으려고 한다.
만약 지금 시간이 13:52:30이고, 임무를 시작한 시간이 14:00:00 이라면 도현이에게 남은시간은 00:07:30 이다.
모든 시간은 00:00:00 ~ 23:59:59로 표현할 수 있다. 입력과 출력에 주어지는 모든 시간은 XX:XX:XX 형태이며, 숫자가 2자리가 아닐 경우에는 0으로 채운다.
도현이가 임무를 시작한 시간과, 현재 시간이 주어졌을 때, 도현이에게 남은 시간을 구하는 프로그램을 작성하시오.
입력 :
첫째 줄에는 현재 시간이, 둘째 줄에는 도현이가 임무를 시작한 시간이 주어진다. 임무를 시작한 시간과 현재 시간이 같은 경우는 주어지지 않는다.
출력 :
첫째 줄에 도현이가 임무를 수행하는데 남은 시간을 문제에서 주어지는 시간의 형태 (XX:XX:XX)에 맞춰 출력한다.
풀이)
문자열과 숫자를 왔다 갔다 해야하므로.
`stoi()`, `substr()`, `to_string()`을 잘 활용해야하는 문제이다.
오랜만에 알고리즘을 풀어보았더니 많이 어렵더라.. 열심히 해야지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <iostream>
#include <string>
using namespace std;
// 구조체를 이용하여 새로운 타입의 자료형을 만들어준다.
typedef struct {
int hour;
int minute;
int second;
} Time;
// setTime 함수를 이용, string에 들어있는 각 숫자들을 뽑아 int로 변환해준다.
Time setTime(string time) {
return Time{
stoi(time.substr(0, 2)),
stoi(time.substr(3, 2)),
stoi(time.substr(6, 2))
};
}
// 남은 시간을 계산하는 과정
int calTime(Time current, Time start) {
int currentMinute = 0, currentSecond = 0;
currentMinute += current.hour * 60;
currentSecond = currentMinute * 60 + current.minute * 60 + current.second;
int startMinute = 0, startSecond = 0;
startMinute += start.hour * 60;
startSecond = startMinute * 60 + start.minute * 60 + start.second;
int remain = startSecond - currentSecond;
// 날짜가 바뀔 경우, 음수가 나오기 때문에 보정을 해주어야 한다.
if (remain < 0) {
remain += 24 * 60 * 60;
}
return remain;
}
// 각 시간대가 한자리일 경우, 답에 맞게 출력을 바꿔준다.
void printTime(int time) {
string hours = to_string(time / (60 * 60));
string minutes = to_string(time % (60 * 60) / 60);
string seconds = to_string((time % (60 * 60)) % 60);
hours = hours.length() == 1 ? '0' + hours : hours;
minutes = minutes.length() == 1 ? '0' + minutes : minutes;
seconds = seconds.length() == 1 ? '0' + seconds : seconds;
cout << hours << ':' << minutes << ':' << seconds << endl;
}
int main()
{
string now;
cin >> now;
Time currentTime = setTime(now);
string start;
cin >> start;
Time startTime = setTime(start);
int remain = calTime(currentTime, startTime);
printTime(remain);
return 0;
}
|
cs |
'Develop > 백준 (Cpp)' 카테고리의 다른 글
[백준] 10833번: 사과 (C++) (0) | 2023.01.20 |
---|---|
[백준] 10984번: 내 학점을 구해줘 (C++) (0) | 2023.01.19 |
[백준] 16472번: 고냥이 (C++) (0) | 2022.06.29 |
[백준] 1644번: 소수의 연속합 (C++) (0) | 2022.06.29 |
[백준] 2467번: 용액 (C++) (0) | 2022.06.28 |