본문 바로가기

코딩/백준 BOJ

[백준/C언어] 2884번 - 알람 시계

백준 웹사이트 "2884번 - 알람 시계" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net


소스 코드

#include <stdio.h>

int main(void){
    int H, M;
    scanf("%d %d", &H, &M);

    if(M>=45)
        printf("%d %d", H, M-45);
    else if(H>0)
        printf("%d %d", H-1, 60-(45-M));
    else
        printf("23 %d", 60-(45-M));
}

문제 풀이

세 가지 경우를 생각하면 됩니다.

 

1) M이 45 이상일 경우: M에서 45를 뺍니다

2) (M이 45 미만이면서) H가 0이 아닐 경우: H에서 1을 빼고, 분을 60-(45-M) 으로 바꿉니다 

3) (M이 45 미만이면서) H가 0일 경우: H를 23으로 바꾸고, 분을 60-(45-M) 으로 바꿉니다

 

  이러한 문제를 쉽게 푸는 방법은 2753번 문제처럼 상위 규칙이 무엇인가를 파악하고, 상위 규칙부터 처리해주는 것입니다. 결과를 내기 전, 우리는 두 가지 질문에 답해야 합니다: 'M은 45 이상인가?', 'H가 0인가?'. M이 45이상이라면, H가 0인지의 여부와 관계없이 M에서 45만 빼주면 충분하기에 'M은 45 이상인가?'라는 질문을 먼저 던져주면 위와 같은 세 가지 경우만 생각하면 됩니다. 반면에, 'H가 0인가'라는 질문부터 한다면, 아래와 같은 네 가지 경우를 생각해야 합니다.

 

1) H가 0이고, M이 45 이상일 경우: M에서 45를 뺍니다

2) H가 0이고, M이 45 미만일 경우: H를 23으로 바꾸고, 분을 60-(45-M) 으로 바꿉니다

3) (H가 0이 아니고) M이 45 이상일 경우: M에서 45를 뺍니다

4) (H가 0이 아니고) M이 45 미만일 경우: H에서 1을 빼고, 분을 60-(45-M) 으로 바꿉니다

 

  따라서 어떤 조건부터 확인하냐에 따라, 생성해야 하는 if/else 구문의 개수가 차이납니다. 당연히 세 가지 경우만 확인할 경우가 시행 시간도 빠르고, 코드 작성자 입장에서도 헷갈릴 일이 적겠죠? 이렇듯, 코드를 작성하기 전 어떤 조건을 먼저 검사해줄 것인가를 고민해보는 과정도 가져보면 좋습니다!

반응형