문제
창영마을에서 정인이의 반란은 실패로 끝났다.
테러리스트로 변신한 정인이는 창영마을에 경고를 하려고 한다.
사실 정인이는 창영마을에서 제일 착한사람이다. 따라서, 사람들을 다치지 않게하려고 한다.
유튜브에서 폭발에 대한 동영상을 찾아보다가, 그는 나트륨을 물에 던지면 폭발한다는 사실을 알게 되었다.
정인이는 창영마을의 중심을 지나는 "강산강" 근처에 숨어있다가, 나트륨을 위의 동영상처럼 물에 던질 것이다.
현재 시간과 정인이가 나트륨을 던질 시간이 주어졌을 때, 정인이가 얼마나 숨어있어야 하는지 구하는 프로그램을 작성하시오. (정인이는 적어도 1초를 기다리며, 많아야 24시간을 기다린다.)
입력
첫째 줄에 현재 시간이 hh:mm:ss 형식으로 주어진다. (시, 분, 초) hh는 0보다 크거나 같고, 23보다 작거나 같으며, 분과 초는 0보다 크거나 같고, 59보다 작거나 같다.
둘째 줄에는 나트륨을 던질 시간이 위와 같은 형식으로 주어진다.
출력
첫째 줄에 정인이가 기다려야 하는 시간을 입력과 같은 형식으로 출력한다.
예제 입력 1
20:00:00
04:00:00
예제 출력 1
08:00:00
[ 문제 해석 ]
두 줄의 입력이 주어지는데, 각각 hh:mm:ss의 형식이고, 두 시각 사이의 시간을 구하면 되는 문제라 두번째 줄 시각에서 첫번째 줄 시각을 빼면 된다.
[ 코드 ]
#include <iostream>
using namespace std;
int main() {
int a[3], b[3], t[3];
scanf("%d:%d:%d", &a[0], &a[1], &a[2]);
scanf("%d:%d:%d", &b[0], &b[1], &b[2]);
if(b[2]>=a[2]) t[2]=b[2]-a[2];
else if(b[2]<a[2]){
t[2]=60+b[2]-a[2];
b[1]--;
}
if(b[1]>=a[1]) t[1]=b[1]-a[1];
else if(b[1]<a[1]){
t[1]=60+b[1]-a[1];
b[0]--;
}
if(b[0]>=a[0]) t[0]=b[0]-a[0];
else if(b[0]<a[0]){
t[0]=24+b[0]-a[0];
}
if(t[0]==0 && t[1]==0 && t[2]==0) t[0]=24;
printf("%02d:%02d:%02d\n", t[0], t[1], t[2]);
return 0;
}
[ 문제 풀이 ]
단순히 두번째줄에서 첫번째줄을 빼야 한다고 생각하면 큰일난다.
왜냐면 우리는 '시간'을 다루고 있기 때문이다.
시, 분, 초를 고려해야 하고 각각의 범위를 생각해서 60초 이상이면 1분, 60분 이상이면 1시간 이런식으로 넘어가는 것 까지를 생각해야 한다.
입력받는 형식이 hh:mm:ss여서 처음에는 ':'을 어떻게 처리해야 할지도 고민했는데, 단순히 생각해서 cin을 사용하지 말고 scanf로 각 hh mm ss 사이에 : 기호를 넣어주면 됐었다.
또한 h m s를 리스트로 생각해서, [ ] 안에 하나씩 넣어줬는데, 이렇게 하면 뺄셈을 할 때 계산 과정을 한 눈에 볼 수 있을 뿐만 아니라 초 기준으로 60초 이상, 분 기준으로 60분 이상이 된다면 각각 1분, 1시간으로 넘겨줄 때의 과정을 수식으로 정리하기가 용이했기 때문이다.
마지막으로 출력시 꼭 두자리수로 출력을 하라고 문제에 명시되어 있었는데, 그냥 printf("%d")로 쓰면 08시로 출력되어야 하는 것이 8시로 출력되기 때문에 기초적이지만 까먹었던 자릿수 부분에 있어서도 다시 상기할 수 있었다.
'Koala - 5기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준/C++] 4963번 섬의 개수 (0) | 2022.02.28 |
---|---|
[백준/python] 17608 막대기 (0) | 2022.02.28 |
[BOJ/python] 2023번 신기한 소수 (0) | 2022.02.27 |
[BOJ / PYTHON ] 15649 N과M (0) | 2022.02.26 |
[백준/python] 1032번 명령 프롬포트 (0) | 2022.02.21 |