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
반응형
'컴퓨터 > 알고리즘' 카테고리의 다른 글
[SWEA] 10726. 이진수 표현 (비트마스크),연산자 우선순위 (0) | 2021.02.17 |
---|---|
[SWEA] 10570. 제곱 팰린드롬 수 (0) | 2021.02.16 |
[BOJ] 2839. 설탕배달 (0) | 2021.02.10 |
[SWEA] 10761. 신뢰(로봇 버튼누르기) (4) | 2021.02.09 |
[SWEA] 10965. 제곱수 만들기 (에라토스테네스의 체) 빠른속도 (0) | 2021.02.06 |