본문 바로가기
Develop/백준 (Cpp)

[백준] 1408번: 24 (C++)

by Tarra 2023. 1. 19.

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(02)),
        stoi(time.substr(32)),
        stoi(time.substr(62))
    };
}
 
// 남은 시간을 계산하는 과정
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