백준 웹사이트 "2884번 - 알람 시계" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#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 구문의 개수가 차이납니다. 당연히 세 가지 경우만 확인할 경우가 시행 시간도 빠르고, 코드 작성자 입장에서도 헷갈릴 일이 적겠죠? 이렇듯, 코드를 작성하기 전 어떤 조건을 먼저 검사해줄 것인가를 고민해보는 과정도 가져보면 좋습니다!
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 10950번 - A+B - 3 (0) | 2021.12.23 |
---|---|
[백준/C언어] 2739번 - 구구단 (0) | 2021.12.23 |
[백준/C언어] 14681번 - 사분면 고르기 (0) | 2021.12.22 |
[백준/C언어] 2753번 - 윤년 (0) | 2021.12.22 |
[백준/C언어] 9498번 - 시험 성적 (0) | 2021.12.22 |