블램의 일상 IT카페
백준 2884번 [알람시계] - 간단풀이 <C언어> 본문
문제.
내가 틀린 이유.
: c언어 이해도 부족, else if문 마지막에 else문으로 끝내야 한단걸 몰랐다.
그니깐
if문
else if문
else if문
// ^ 처럼 끝내면 백준에서 안받아준다..(분명 컴파일러로는 잘 돌아가는뎁쇼..)
if문
else if문
else문
//혹시나 해서 ^ 이렇게 해봤더니 되더라구요..
흠... 대충 이것만 아니였어도 1시간 미만으로 푼건데... (대충 코드 다짜고 했을떄가 35분쯤 걸렸다.)
나 발전한건가~!!!! ㅠㅜ
풀이.
#include <stdio.h>
int main() {
int H, M;
scanf("%d %d", &H, &M);
if(H==0&&M>=45){
H = 0;
M = M-45;
printf("%d %d", H, M);
}
//^ 대충 H=0이든 H=H든 상관없
else if(H==0&&M<=45){
H = H+23;
M = M+15;
printf("%d %d", H, M);
}
else if(H!=0&&M>=45){
H = H;
M = M-45;
printf("%d %d", H, M);
}
//^ 여긴 H=0 하면 안됨
else{
H = H-1;
M = M+15;
printf("%d %d", H, M);
}
return 0;
}
: 우선 H는 시간, M은 분 이다.
큰 경우를 2가지로 나눌 수 있다.
H가 0일때
첫번째 조건문, 두번째 조건문
H가 0이 아닐때
세번째 조건문, 네번째 조건문
1. 첫번째 조건문 (H가 0일때, M이 45이상일때)
- 시간이 0이면서 45분 이상(ex: 48, 55)라면
시간은 안바꿔줘도 되므로 M(분)에서 45를 빼준다. 그이유는 45이상을 빼면 시간은 그대로이기에...
2. 두번째 조건문 (H가 0일때, M이 45이하일때)
- 시간이 0이면서 45분 이하(ex: 44, 33)라면
시간은 바꿔줘야 되므로 H를 0시 이전인 23시로 바꿔주기 위해 +23해준다.
M(분)에서 15를 더해준다. 그이유는 이따 설명
3. 세번째 조건문 (H가 0아닐때, M이 45이상일때)
- 시간이 0아니면서(ex: 23, 5, 10), 45분 이상(ex: 48, 55)라면
시간은 그 이전 시간으로 바꿔줘야하므로 H -1 을 해준다.
M(분)에서 45를 빼준다. 그이유는 45이상을 빼면 시간은 그대로이기에...
4. 네번째 조건문 else문이므로 이와는 다 해당되지 않는 경우. (H가 0아닐때, M이 45이하일때)
- 시간이 0아니면서(ex: 23, 5, 10), 45분 이하(ex: 44, 33)라면
시간은 그 이전 시간으로 바꿔줘야하므로 H -1 을 해준다.
M(분)에서 15를 더해준다. 그이유는 이따 설명
끝
Why 15를 더해주는가.
내가 대충 풀면서 노트에 끄적인 수식을 보면 된다.
고딩때 한국사 공부한 흔적.. 쿠쿸
수식을 보면 23시 30분에서 45분을 빼준다.
이때 -45를 (-30 + -15)로 바꿔준다. 더 쉽게 풀기위해,
그러면 30을 빼면 23시 00분이 된다.
그 후 23시 00분에서 아까 남은 -15를 빼주면 22시 45분이 된다.
그러면 30분이란 숫자에서 45란 숫자의 차이는 15가 된다.(사실 60제외하고 -15남았는데 당연한거다..)
잘 이해가 안되는가? 그럼 다음 경우를 보자
22시 14분에서 45분을 빼려한다.
그럼 아까처럼 -45를 (-14 + -31) 로 바꿔준다.
아까처럼 -14를 제외하면 22시 00분이 된다.
남은 -31을 빼주면
21시 29분이 된다.
이때도 마찬가지로 14분이란 숫자와 29분 이라는 숫자의 차이는 15이다.
즉 M(분)에서 45분을 뺀수를 구하고 싶으면 15를 더하면 나온다.
그이유는 아까도 말했듯 마지막 결과로 나온 분의 숫자에서
뺄셈 하기 이전 분의 숫자만큼 빼주면 00분이 되는데 이때 남은 숫자는 항상 15이다.
대충 나도 잘 이해 안되는 설명인데;;;
왜 이렇게 되는가를 따지면 그냥 숫자도 아니라 시간개념이라 그렇다.
시간은 0~23시로 한전되어있고, 분도 0~59까지 한정되어있어서
살짝 우리가 아는 정수개념이랑 달라서 그런거다.
만약 35분 일찍 일어나려했다면 -35일경우엔
이런 규칙을 찾을 수 있다.
뭐 이경우엔 25를 더해주면 되겠지...
다른 경우의 수를 대입해도 다 될거다.(5의 배수가 더 쉽긴하지만)
뭐 23시 8분보다 14분 일찍일어나고 싶다의 경우면 46을 더해주면 된다.
그냥 이런 문제는 규칙을 찾아야한다.
if문을 쓸려면 어떤 문제든 규칙이 숨어있다.(뭐 나도 예제에서 규칙을 찾은거라...)
이런 문제들을 많이 풀어봐야겠다. 나도 좀 이해하기 힘든...
'IT > 알고리즘 문제 풀이' 카테고리의 다른 글
[C]백준 2525번 [오븐시계] - 풀이 (0) | 2022.11.22 |
---|---|
[C]백준 1546번 [평균] - 풀이 (0) | 2022.11.22 |
5일간 알고리즘 문제를 풀면서 느낀점. (삐-빅 브론즈입니다...) (2) | 2022.11.18 |
백준 10807번 [개수 세기] - 풀이 (0) | 2022.11.18 |
백준 1110번 [더하기 사이클] - 풀이(이거 저만 어렵나요...) (0) | 2022.11.18 |