RATIO 문제 접근이 잘못되었는지 궁금합니다.. 고수님들의 조언이 필요합니다.

  • leekeezz
    leekeezz

    RATIO 문제 접근이 잘못되었는지 궁금합니다.. 고수님들의 조언이 필요합니다. 한수부탁드립니다.!

    #include <stdio.h>
    
    int main(void){
        int case_num, temp1, temp2, cnt1, cnt2, n, m;
        int result[10000];
        scanf("%d", &case_num);
        for(int i=0;i<case_num;i++){
            scanf("%d %d",&n, &m);
            temp1 = (int)(((double)m/n)*100);
            if(temp1 == 100 || temp1 == 99 || m>n){
                result[i] = -1;
                continue;
            }
            cnt1 = 1000000000;
            cnt2 = 2000000000;
            for(;;){
                temp2 = (int)(((double)(m+cnt1)/(n+cnt1))*100);
                if(temp2 - temp1 >= 1){
                    if(cnt2-cnt1 == 1){
                        result[i] = cnt1;
                        break;
                    }
                    cnt2 = cnt1;
                    cnt1 = cnt1/2;
                    continue;
                }
                else if(temp2 - temp1 < 1){
                    if(cnt2-cnt1 == 1){
                        result[i] = cnt1+1;
                        break;
                    }
                    cnt1 = cnt1+(cnt2-cnt1)/2;
                }
            }
        }
        for(int i=0;i<case_num;i++){
            printf("%d\n", result[i]);
        }
        return 0;
    }
    

    10년 전
4개의 댓글이 있습니다.
  • restart
    restart

    floating type변수의 precision문제네요. 비율을 계산하는 구문에서 double로 캐스팅하여 나눗셈을 적용하면 오차가 생길 수 있습니다. 따라서 n,m을 long long형으로 선언한 후 m*100/n으로 구하는 게 더 정확합니다.


    10년 전 link
  • restart
    restart

    자주 하는 실수 모음에 나와있고, <알고리즘 문제 해결 전략>에서 더 자세하게 나옵니다. 정수문제는 정수로만 푸는게 머리아픈 실수를 방지하는 데 좋아요.


    10년 전 link
  • restart
    restart

    마지막으로, 소스코드만 떡하니 붙여놓는 건 좋은 질문 방법이 아닙니다.


    10년 전 link
  • leekeezz
    leekeezz

    restart님 정말 감사합니다.. 그리고 마지막에 소스코드만 떡하니 붙여놓은 점도 죄송합니다...!!


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.