[145] Gondwanaland Telecom






Problem Link : http://acm.uva.es/p/v1/145.html










■ Problem
– 전화한 시간을 낮구간, 저녁, 심야 구분해서 가격을 책정하는 문제

■ Solution
– 흠.. 처음에는 구간걸치는 경우 9가지로 나눠서 노가다로 했는데… 잘안되서..
   열심히 손으로 규칙을 찾다가 구간이 나눠지는 시간을 분으로 바꿔서 나눗셈연산자를 이용함

■ Critical Input
– 내가 실수한 가장 큰 부분이…. 0시 0분부터 0시 0분까지 통화했다는 인풋…
   멍청하게 왜 0으로 계산했지… 사이트찾아보니 0시 0분 인풋케이스 아웃풋이 24시간이라는 것을 복
   고치니까 바로 억셉트…





[ Source Code ]

#include <stdio.h>

double charging[5][3] = { { 0.10, 0.06, 0.02 },
{ 0.25, 0.15, 0.05 },
{ 0.53, 0.33, 0.13 },
{ 0.87, 0.47, 0.17 },
{ 1.44, 0.80, 0.30 } };

int main ( void )
{

char distance, number[8];
int start_time_m, end_time_m, start_time[2], end_time[2], output[3] = { 0, }, i, j;
double result = 0;
int value[4] = { 480, 1080, 1320, 1440 }, check;

while ( 1 ) {
scanf ( %c, &distance );
if ( distance == ‘#’ ) {
break;
}
getchar();
scanf ( %s, number );

scanf ( %d %d %d %d, &start_time[0], &start_time[1], &end_time[0], &end_time[1] );
getchar ();

// 입력된 시간을 분으로 계산한다.
start_time_m = start_time[0] * 60 + start_time[1];
end_time_m = end_time[0] * 60 + end_time[1];

// start_time과 end_time이 같을때 24시간 출력후 continue
if ( start_time_m == end_time_m ) {
output[0] = 600;
output[1] = 240;
output[2] = 600;
for ( i = 0 ; i < 3 ; i++ ) {
j = distance – 65;
result += charging[j][i] * output[i];
}
printf(%10s%6d%6d%6d%3c%8.2f\n,
number, output[0], output[1], output[2], distance, result );
continue;
}

check = 0;
// start_time과 end_time이 같은 구간일 경우
if ( end_time_m > start_time_m ) {
if ( ( 480 <= start_time_m && start_time_m < 1080 ) &&
( 480 <= end_time_m && end_time_m < 1080 ) ) {
output[0] = end_time_m – start_time_m;
check = 1;
}
else if ( ( 1080 <= start_time_m && start_time_m < 1320 ) &&
( 1080 <= end_time_m && end_time_m < 3120 ) ) {
output[1] = end_time_m – start_time_m;
check = 1;
}
else if ( ( 1320 <= start_time_m && start_time_m < 1440 ) &&
( 1320 <= end_time_m && end_time_m < 1440 ) ) {
output[2] = end_time_m – start_time_m;
check = 1;
}
else if ( ( 0 <= start_time_m && start_time_m < 480 ) &&
( 0 <= end_time_m && end_time_m < 480 ) ) {
output[2] = end_time_m – start_time_m;
check = 1;
}
}

// 같은 구간일때 그냥 차이 구해서 출력후 continue
if ( check == 1 ) {
for ( i = 0 ; i < 3 ; i++ ) {
j = distance – 65;
result += charging[j][i] * output[i];
}
printf(%10s%6d%6d%6d%3c%8.2f\n,
number, output[0], output[1], output[2], distance, result );

//변수 초기화
output[0] = output[1] = output[2] = result = 0;
continue;
}

//start_time과 end_time이 다른 구간에 걸쳐 있을때
// start_time부터 다음 구분영역까지의 계산
for ( i = 0 ; i < 4 ; i++ ) {
if ( start_time_m / value[i] != 0 ) {
continue;
}
else {
if ( i == 0 ) {
output[2] = value[i] – start_time_m;
}
else {
output[i-1] = value[i] – start_time_m;
}
break;
}
}

// start_time이 end_time 보다 크거나 작거나에 따라
if ( start_time_m > end_time_m ) {
// start_time 첫 영역 다음부터 24시까지의 시간
for ( j = i+1 ; j < 4 ; j++ ) {
output[j-1] += value[j] – value[j-1];
}
//0시부터 end_time까지의 계산
for ( i = 0 ; i < 4 ; i++ ) {
if ( value[i] > end_time_m ) {
if ( i == 0 ) {
output[2] += end_time_m;
break;
}
else {
output[i-1] += end_time_m % value[i-1];
break;
}
}
else {
if ( i == 0 ) {
output[2] += value[i];
}
else {
output[i-1] += value[i] – value[i-1];
}
}
}
}
else {
for ( j = i+1 ; j < 4 ; j++ ) {
if ( value[j] <= end_time_m ) {
output[j-1] += value[j] – value[j-1];
}
else {
output[j-1] += end_time_m % value[j-1];
break;
}
}

}

// 요금계산해서 출력 해주는 부분
for ( i = 0 ; i < 3 ; i++ ) {
j = distance – 65;
result += charging[j][i] * output[i];
}
printf(%10s%6d%6d%6d%3c%8.2f\n,
number, output[0], output[1], output[2], distance, result );

//변수 초기화
output[0] = output[1] = output[2] = result = 0;
}

return 0;

}

댓글 남기기