코딩테스트 & 문제 풀이

[C]백준_2884 : 알람 시계

Hicecream 2023. 4. 14. 16:06

2022년 5월 8일에 작성됨

 

https://www.acmicpc.net/problem/2884

 

2884번: 알람 시계

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

www.acmicpc.net

 

 

문제 분석

입력한 시간에서 45분을 앞당긴 시간을 출력한다.

 

 

코드-1 (❌)

#include <stdio.h>

int main(void)
{
    int H1, M1, H2, M2;
    
    scanf("%d %d", &H1, &M1);
    
    H2 = (60 * H1 + M1 - 45) / 60;
    M2 = (60 * H1 + M1 - 45) % 60;
    
    printf("%d %d", H2, M2);
    
    return 0;
}

<결과>

실패. 0과 30을 입력했더니 음수가 나왔다. 하루의 시작과 끝을 고려하지 않았기 때문인 것 같다.

 

 

코드-2 (⭕)

#include <stdio.h>

int main(void)
{
	int H, M;

	scanf("%d %d", &H, &M);
	
	if (H == 0 && M < 45)
		printf("23 %d", 60 - (45 - M));

	else
		printf("%d %d", (60 * H + M - 45) / 60, (60 * H + M - 45) % 60);

	return 0;
}

 

코드 분석

1. 일단 모두 분 단위로 바꾸어서 계산해 주었다.

 

2. if ~ else문을 사용하여 H가 0이고, M이 45보다 작을 때, 음수가 나오는 걸 방지 하기 위해서 H는 전날 23시가 되고, M은 60-(45-M)으로 60분으로 되돌아가서 남은 시간을 빼주는 식을 세웠다.

 

3. else에서는 시간과 분을 합쳐서 분 단위로 바꾸고 60으로 나눈 몫을 시간, 나머지를 분으로 나오게 출력했다.

 

 

 

end

문제 의도를 정확히 파악하지 못한 채로 너무 쉽게 풀려고 했던 것 같다. 앞으로는 먼저 문제를 정확히 파악한 다음, 어떻게 풀어나가야 할 지 깊게 생각해보는 것이 필요할 것 같다.