블램의 일상 IT카페

백준 2884번 [알람시계] - 간단풀이 <C언어> 본문

IT/알고리즘 문제 풀이

백준 2884번 [알람시계] - 간단풀이 <C언어>

ble_ram 2022. 11. 19. 13:01

문제.


 

 

 

 

내가 틀린 이유.


: 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문을 쓸려면 어떤 문제든 규칙이 숨어있다.(뭐 나도 예제에서 규칙을 찾은거라...)

 

이런 문제들을 많이 풀어봐야겠다. 나도 좀 이해하기 힘든...


Comments