2884번: 알람 시계
상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,
www.acmicpc.net
먼저, 시간과 분을 입력받아 변수 H와 M에 저장한다.
일반적인 정수는 10을 기준으로 자릿수가 올라간다.
시간은 60분 단위이므로 일반적인 정수의 뺄셈과 비슷하지만 다르다.
두 자리 이상의 정수의 뺄셈에서 받아내림이 있는 뺄셈을 생각해 보자.
두 자리 이상의 정수의 뺄셈을 할 때 일의 자리끼리 뺐을 때 음수가 나오면,
십의 자리에서 1을 빼서 즉, 10을 빌려서 일의자리에 더해준 후 계산한다.
가령, 75 - 49를 계산할 때
일의자리의 뺄셈을 먼저 하는데, 5 - 9는 음수이므로
십의자리인 7에서 1을 빼서, 즉 10을 빌려서 일의자리에 더해준 후 계산한다.
이렇게 하면, 5가 아니라 15에서 9를 빼는 것이고,
십의자리도 7이 아니라 6이 되므로, 십의자리 계산에서는 6 - 4를 하면 된다.
시간의 계산도 마찬가지다.
십진수에서는 10을 빌렸지만,
시간은 60분 단위이므로 60분을 빌리면 된다.
M이 45보다 작다면 45분을 뺐을 때 음수가 된다.
따라서 H에서 1시간을 빼서, 즉 60분을 빌려서 M에 더해준 후 45분을 빼면 된다.
H는 M에게 1시간을 빌려줬으므로 1시간이 줄어들어 H - 1 이 된다.
이 때, H가 0이 었다면 1시간을 뺐을 때 -1이 된다.
시간은 24시간 단위이므로 원래대로라면 날짜에서 1일을 빼서 즉, 24시간을 빌려서 H에 더해주면 된다.
이 문제에서 날짜는 고려하지 않으므로 시간에 24시간만 더해주면 원하는 결과가 나올 것이다.
정리해보면 다음과 같다.
M이 45보다 작다면
H에서 1시간을 빌려온다.
이 때 H는 1시간 줄어들고, M에 빌려온 1시간(60분)을 더한 후 45분을 뺀다.
H가 1시간 줄어들면서 음수가 될 수 있다. (처음에 입력받은 시간이 0시였을 때)
이 때는 24시간을 더하면 된다.
M이 45보다 크거나 같다면
45분을 빼도 음수가 나오지 않으므로
M에서 45분만 빼면 된다.
#include <stdio.h>
int main(void) {
int H, M; // 시간과 분을 저장할 변수 2개 선언
scanf("%d %d", &H, &M); // 시간과 분을 입력받아 변수 H, M에 저장
if (M < 45) { // M이 45보다 작다면 (M - 45 했을 때 음수가 됨)
H = H - 1; // H에서 1시간 뺌 (1시간을 빼서 M에 줌)
M = M + 60 - 45; // H가 준 1시간(60분)을 더한 후 45분을 뺌
if (H < 0) { // H가 음수가 되었다면
H = H + 24; // 24시간을 더해서 양수로 바꿈
}
}
else { // M이 45보다 크거나 같다면 (M - 45 해도 음수가 되지 않음)
M = M - 45; // M에서 45분을 뺌
}
printf("%d %d", H, M); // 바뀐 H와 M 출력
return 0;
}
'PS > 백준' 카테고리의 다른 글
[백준] 14681번: 사분면 고르기 [C] (0) | 2023.01.03 |
---|---|
[백준] 2753번: 윤년 [C] (0) | 2023.01.03 |
[백준] 9498번: 시험 성적 [C] (0) | 2023.01.03 |
[백준] 1330번: 두 수 비교하기 [C] (0) | 2023.01.03 |
[백준 > 단계별로 풀어보기] 1단계 입출력과 사칙연산 (답) [C / C++] (0) | 2023.01.03 |