본문 바로가기
컴퓨터/알고리즘

[SWEA] 11387. 몬스터 사냥 (float대신 double을 써야하는 이유)

by IT황구 2021. 2. 15.
728x90
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AXb6LR76vCcDFARR&categoryId=AXb6LR76vCcDFARR&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=3&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

=====속도가 느린버전=======

#include<cstdio>
int main(void)
{
    int size;
    double sum,d,l,n;
    scanf("%d",&size);
    for(int t = 0; t < size; t++)
    {
        sum = 0;
        scanf("%lf %lf %lf",&d,&l,&n);
        for(int i = 0; i < n; i++)
        {
            sum += d*(1 + i * l/100.0);
        }
        printf("#%d %.0lf\n",t+1,sum);
    }   
    return 0;
}


시행착오 :

일단 답만보면 말도안되게 쉽다. 근데 저 자료형 때문에 시간을 하루는 날린것 같다.

뭐 깊이 생각하면 round2even 에서 문제가 발생하는것 같은데. 소수점의 정밀도 float double차이도 있고..

처음에 int로 했다가 tc가 10000개에서 9983개만 맞았다고 해서 너무 오래걸렸다.

다른사람이 푼 풀이를 볼 수 없는데..

천줄을 넘게 짜고 속도도 1천ms가 넘는데 어떤 다른 방식으로 푼건지 궁금하다.

볼 수 있게좀 해주세요..

맨 처음 시도한 코드(실패)

#include<cstdio>
typedef long long ll;
using namespace std;
int main(void)
{
	int size;
	
	int sum,d,l,n;
	
	scanf("%d",&size);
	for(int t = 0; t < size; t++)
	{
		sum = 0;
		scanf("%d %d %d",&d,&l,&n);
		for(int i = 0; i < n; i++)
		{
			
			sum += d*(1 + i * l/100.0);
		}
		printf("#%d %d\n",t+1,sum);
		//printf("#%d %lld\n",t+1,(ll)(sum+0.5));
	}	
	return 0;
}
​

일단 이걸 들어가기 전에..

float와 double중에 double을 써야하는 이유가 있다.

두 사진을 보면 같은 숫자이지만 자릿수 표현의 범위때문에 정밀도로 인한 올림이 발생해버린다.

이 1 차이가 오답을 만들어 낼 수 있다.

또한 (int)266363.989300 을 하면 266363으로 나오는데

저 for문에서 돌아가다가

이걸 double로 놓고 계산하면 266364.000000 으로 나온다. 강제로 형 변환을 할때 문제가 좀 생긴다.

앞으로는 이렇게 풀어야겠다.

문제에 소수점을 계산하고 int가 섞여있으면 그냥 다 double로 놓고 출력을 .0lf 로 하는게 더 정확할것 같다.

===========가장 속도가 빠른버전(등차수열 합 이용)=====

Double의 정밀도 및 중요성을 깨닫게 된 좋은 계기였다.

===END===

 

728x90
반응형