반응형
먼저, 시간과 분을 입력받아 변수 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 |