먼저 문제를 읽고 이런 식으로 조건을 정리했다.
그리고 생각한 풀이
전에는 눈에 힘 빡 주고 풀었는데 이제는 그냥 적는게 편하다. 정리도 되고 놓친 조건 찾기도 쉽고
저기 오른쪽에 sec %= 60으로 적었는데 (59 + 2) % 60이 되어야 할 것 같다 (코드에는 반영 함)
#include <iostream>
int main() {
int now_hour, now_min, now_sec;
int time;
scanf("%d %d %d %d", &now_hour, &now_min, &now_sec, &time);
int hour = time / 3600;
time %= 3600;
int minute = time / 60;
time %= 60;
int sec = time;
int add = 0;
add = (now_sec + sec) / 60;
now_sec = (now_sec + sec) % 60;
add = (now_min + minute + add) / 60;
now_min = (now_min + minute + add) % 60;
now_hour = (now_hour + hour + add) % 24;
printf("%d %d %d", now_hour, now_min, now_sec);
}
아 근데 틀렸다.
#include <iostream>
int main() {
int now_hour, now_min, now_sec;
int time;
scanf("%d %d %d %d", &now_hour, &now_min, &now_sec, &time);
int hour = time / 3600;
time %= 3600;
int minute = time / 60;
time %= 60;
int sec = time;
int add = 0;
add = (now_sec + sec) / 60;
now_sec = (now_sec + sec) % 60;
now_min = (now_min + minute + add) % 60;
add = (now_min + minute + add) / 60;
now_hour = (now_hour + hour + add) % 24;
printf("%d %d %d", now_hour, now_min, now_sec);
}
그다음 어디서 틀렸나 했더니
now_min = (now_min + minute + add) % 60;
add = (now_min + minute + add) / 60;
이 부분에서 틀린 것 같았다. 보니깐 add로 먼저 분을 계산하고 add값을 바꿔줘야 하는데 순서가 반대여서 add값이 이상하게 계산된 듯하다.
하지만 결과는 또 틀렸다
#include <iostream>
int main() {
int now_hour, now_min, now_sec;
int add_min;
int time;
scanf("%d %d %d %d", &now_hour, &now_min, &now_sec, &time);
int hour = time / 3600;
time %= 3600;
int minute = time / 60;
time %= 60;
int sec = time;
int add = 0;
add = (now_sec + sec) / 60;
now_sec = (now_sec + sec) % 60;
add_min = (now_min + minute + add) % 60;
add = (now_min + minute + add) / 60;
now_hour = (now_hour + hour + add) % 24;
printf("%d %d %d", now_hour, add_min, now_sec);
}
그래서 어쩌지 하다가 다시 종이에 (전자종이..) 알고리즘을 짜봤다. 그러다 잘못된 부분을 찾았다!
now_min = (now_min + minute + add) % 60;
add = (now_min + minute + add) / 60;
아까 add값이 바꾼다고 순서를 바꿨는데 그럼 now_min값도 변경된다!
그래서 그냥 값을 대입하지 말고 출력할까 하다 그럼 시 - 분 - 초 순서로 출력되는게 아니라 초 - 분 - 시 순서로 출력되기 때문에 min값만 따로 변수를 만들어서 출력했다.
결과는 맞았다!!! 야호!!!
다음에 풀 때는 이런 부분에서도 틀릴 수 있다는 걸 염두에 둬야겠다. 분명 이상한게 없다 생각하고 풀었는데 이런 부분에서 틀리는구나.
#include <iostream>
int main() {
int h, m, s, t;
scanf("%d %d %d %d", &h, &m, &s, &t);
s += t;
m += s / 60;
h += m / 60;
printf("%d %d %d", h%24, m%60, s%60);
return 0;
}
알고보니 더 좋은 방법이 있었다! 전에 코드 작성하다가 뭔가 같은 일 두 번 반복하는 것 같다고 생각했었다. 근데 이렇게 해도 됐었구나.
그냥 뭉텅이로 다 더해버리고 마지막에 출력할 때 나눠준다. 근데 이게 머리로는 이해가 가는데 마음으로는 이해가 잘 안간다. 저래도 되나..? 되 .. 되.. 구나.. 다음에도 써먹어야겠다.
코드 길이가 반이나 줄어들었다.
'백준' 카테고리의 다른 글
10162 전자레인지 (0) | 2019.09.30 |
---|---|
2480 주사위 세 개 (0) | 2019.09.30 |
1712 손익분기점 (0) | 2019.09.29 |
1212 8진수 2진수 (0) | 2019.09.29 |
10039 평균점수 (0) | 2019.09.29 |