코딩테스트 & 문제 풀이
[C]백준_2884 : 알람 시계
Hicecream
2023. 4. 14. 16:06
2022년 5월 8일에 작성됨
https://www.acmicpc.net/problem/2884
2884번: 알람 시계
상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,
www.acmicpc.net
문제 분석
입력한 시간에서 45분을 앞당긴 시간을 출력한다.
코드-1 (❌)
#include <stdio.h>
int main(void)
{
int H1, M1, H2, M2;
scanf("%d %d", &H1, &M1);
H2 = (60 * H1 + M1 - 45) / 60;
M2 = (60 * H1 + M1 - 45) % 60;
printf("%d %d", H2, M2);
return 0;
}
<결과>
실패. 0과 30을 입력했더니 음수가 나왔다. 하루의 시작과 끝을 고려하지 않았기 때문인 것 같다.
코드-2 (⭕)
#include <stdio.h>
int main(void)
{
int H, M;
scanf("%d %d", &H, &M);
if (H == 0 && M < 45)
printf("23 %d", 60 - (45 - M));
else
printf("%d %d", (60 * H + M - 45) / 60, (60 * H + M - 45) % 60);
return 0;
}
코드 분석
1. 일단 모두 분 단위로 바꾸어서 계산해 주었다.
2. if ~ else문을 사용하여 H가 0이고, M이 45보다 작을 때, 음수가 나오는 걸 방지 하기 위해서 H는 전날 23시가 되고, M은 60-(45-M)으로 60분으로 되돌아가서 남은 시간을 빼주는 식을 세웠다.
3. else에서는 시간과 분을 합쳐서 분 단위로 바꾸고 60으로 나눈 몫을 시간, 나머지를 분으로 나오게 출력했다.
end
문제 의도를 정확히 파악하지 못한 채로 너무 쉽게 풀려고 했던 것 같다. 앞으로는 먼저 문제를 정확히 파악한 다음, 어떻게 풀어나가야 할 지 깊게 생각해보는 것이 필요할 것 같다.