728x90
728x90

 

문제 링크 : www.acmicpc.net/problem/3029

 

3029번: 경고

첫째 줄에 현재 시간이 hh:mm:ss 형식으로 주어진다. (시, 분, 초) hh는 0보다 크거나 같고, 23보다 작거나 같으며, 분과 초는 0보다 크거나 같고, 59보다 작거나 같다. 둘째 줄에는 나트륨을 던질 시간

www.acmicpc.net

 

 

 

문제

창영마을에서 정인이의 반란은 실패로 끝났다. (3028번)

테러리스트로 변신한 정인이는 창영마을에 경고를 하려고 한다.

사실 정인이는 창영마을에서 제일 착한사람이다. 따라서, 사람들을 다치지 않게하려고 한다.

유튜브에서 폭발에 대한 동영상을 찾아보다가, 그는 나트륨을 물에 던지면 폭발한다는 사실을 알게 되었다.

 

정인이는 창영마을의 중심을 지나는 "강산강" 근처에 숨어있다가, 나트륨을 위의 동영상처럼 물에 던질 것이다.

현재 시간과 정인이가 나트륨을 던질 시간이 주어졌을 때, 정인이가 얼마나 숨어있어야 하는지 구하는 프로그램을 작성하시오. (정인이는 적어도 1초를 기다리며, 많아야 24시간을 기다린다.)

입력

첫째 줄에 현재 시간이 hh:mm:ss 형식으로 주어진다. (시, 분, 초) hh는 0보다 크거나 같고, 23보다 작거나 같으며, 분과 초는 0보다 크거나 같고, 59보다 작거나 같다.

둘째 줄에는 나트륨을 던질 시간이 위와 같은 형식으로 주어진다.

출력

첫째 줄에 정인이가 기다려야 하는 시간을 입력과 같은 형식으로 출력한다.

 

 

 

 

 


접근 방법

 

던질 시간에서 현재 시간을 빼야 기다려야하는 시간을 구할 수 있다.

던질 시간이 현재 시간보다 더 크다면 그냥 빼면 되지만, 그 반대이면 앞 단위에서 1분 또는 1시간을 빌려와야한다. 

예시를 들어보면 더 쉽다.

 

예1. 그냥 빼면 될 때

던질시간 -> 10:25:20

현재 시간 -> 05:10:04

답 : 05:15:16

 

예2. 앞 단위에서 빌려와야 할 때

던질 시간 -> 04:05:20  

현재 시간 -> 20:10:30

 

20초에서 30초를 못 빼므로 1분을 빌려와서 04:04:80초로 만들어준다.

04분에서 10분을 못 빼므로 1시간을 빌려와서 03:64:80초로 만들어준다.

이제 03:64:80에서

       20:10:30을 빼주면 된다. 이때 시간도 못 빼는 경우에는 (24-20)시에 03시를 더해주면 된다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int change(char c1, char c2) {			//char -> int
	
	int res = 0;
	if (c1 == '0') {
		res = c2 - '0';
	}
	else {
		res = (c1 - '0') * 10 + (c2 - '0');
	}
	return res;
}


int main() {


	char curTime[9], nextTime[9];
	scanf("%s", curTime);
	scanf("%s", nextTime);

	int cur_h = change(curTime[0], curTime[1]);
	int cur_m = change(curTime[3], curTime[4]);
	int cur_s = change(curTime[6], curTime[7]);

	int next_h = change(nextTime[0], nextTime[1]);
	int next_m = change(nextTime[3], nextTime[4]);
	int next_s = change(nextTime[6], nextTime[7]);


	if (cur_h==next_h && cur_m==next_m && cur_s==next_s) {	//적어도 1초를 기다리므로
		printf("24:00:00");
	}
	else {

		if (cur_s > next_s) {
			next_m -= 1;
			next_s += 60;
		}
		int s = next_s - cur_s;

		if (cur_m > next_m) {
			next_h -= 1;
			next_m += 60;
		}
		int m = next_m - cur_m;

		int h;
		if (cur_h > next_h) {
			h = (24 - cur_h) + next_h;
		}
		else {
			h = next_h - cur_h;
		}


		//출력 처리
		if (h < 10) {
			printf("0");
		}
		printf("%d:", h);

		if (m < 10) printf("0");
		printf("%d:", m);

		if (s < 10) printf("0");
		printf("%d", s);


	}

	return 0;

}

 

 

 

-시간 초과한 코드

시작 시간에서 1초씩 증가해가면서 시, 분, 초의 범위가 넘어가면 다시 초기화해줬다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int change(char c1, char c2) {
	
	int res = 0;
	if (c1 == '0') {
		res = c2 - '0';
	}
	else {
		res = (c1 - '0') * 10 + (c2 - '0');
	}
	return res;
}



void main() {


	char curTime[9], nextTime[9];
	scanf("%s", curTime);
	scanf("%s", nextTime);

	//printf("%c %c", curTime[0], curTime[1]);

	int cur_h = change(curTime[0], curTime[1]);
	int cur_m = change(curTime[3], curTime[4]);
	int cur_s = change(curTime[6], curTime[7]);

	int next_h = change(nextTime[0], nextTime[1]);
	int next_m = change(nextTime[3], nextTime[4]);
	int next_s = change(nextTime[6], nextTime[7]);
	
	

	//printf("%d %d %d \n%d %d %d\n\n", cur_h, cur_m, cur_s, next_h, next_m, next_s);


	int secCnt = 0;
	//while (cur_h != next_h || cur_m != next_m || cur_s != next_s) {	//셋다 같으면 멈춤
	while(!(cur_h==next_h && cur_m==next_m && cur_s==next_s)){
		secCnt += 1;

		cur_s += 1;
		if (cur_s == 60)
		{
			cur_s = 0;
			cur_m += 1;
		}
		if (cur_m == 60) {
			cur_m = 0;
			cur_h += 1;
		}
		if (cur_h == 24) {
			cur_h == 0;
		}
		printf("%d %d %d\n", cur_h, cur_m, cur_s);

	}
	printf("%d\n", secCnt);

	int h = secCnt / 3600;					
	int r = secCnt - h * 3600;
	int m = r / 60;					
	int s = r - m * 60;


	if (h < 10) {
		printf("0");
	}
	printf("%d:", h);


	if (m < 10) printf("0");
	printf("%d:", m);

	if (s < 10) printf("0");
	printf("%d", s);




}
728x90

+ Recent posts