RATIO 문제 오답의 원을 못찾겠습니다.

  • wondaebal
    wondaebal

    수식으로 계산해서 1% 증가할 때 의 i 값을 찾고 그 값으로 우선 대입하여
    비교하고 혹시나 i 값이 모자랄 것을 대비해 while안에서 제한 범위 내에서 증가하도록 하였습니다.
    조금씩 바꾸면서 예외도 바꿔보고 했는데 실행시간도 빠르고 테스트 케이스도 많이 넣어봣는데 계속 오답으로 나와서, 왜 그런지 궁금합니다!

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        int number=0;
        int play = 0;
        int win = 0;
        double temp=0.0;
        int Z=0;
        int result=0;
        int extra=0;
        bool flag=false;
        int i=0;
    
        scanf("%d",&number);
    
        while( number--)
        {
            scanf("%d %d",&play,&win);
            temp = ((double)win/play)*100;
            Z = (int)temp;
    
            if( Z >= 99 ) flag = false;
            else{
                i = (int)ceil( ( (double)( win*100 - (Z+1)*play ) / ( Z-99 ) ) );
    
                while( i <= 2000000000) {
                    result = (int)((double)(win + i)/(play + i)*100) ;
                    if( (Z + 1) <= result )
                    { 
                        extra = i; flag = true; break;
                    } else flag = false;
                    i++;
                }
            }
            if( flag ) printf("%d\n", extra);
            else printf("%d\n",-1);
        }
        return 0;
    }
    

    혹시 예상치 못하게 while문에서 못나오는 경우가 발생할까봐
    while만 빼고 해봤는데 안되서 쓸데없는거 다 빼버리고 아래처럼도 해봤는데도 오답이 계속 발생하네요..

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        int number=0;
        int play = 0;
        int win = 0;
        int Z=0;
    
        scanf("%d",&number);
    
        while( number--)
        {
            scanf("%d %d",&play,&win);
            Z =  ((double)win/play)*100 + 1;
    
            if( Z < 100 ){
                printf("%d\n", (int)ceil( ( (double)( win*100 - Z*play ) / ( Z-100 ) ) ));
            }else printf("%d\n",-1);
    
        }
        return 0;
    }
    

    치명적인 실수가 있는건지 궁금합니다.


    9년 전
7개의 댓글이 있습니다.
  • astein
    astein

    일단 아래코드에서는 Z = 100일때 문제가 되겠네요 :)


    9년 전 link
  • wondaebal
    wondaebal

    댓글감사합니다.
    그런데 Z=100인 경우는 사실 불가능한 경우 아닌가요??
    조건문에 의하면 -1이 출력될것 같은데 다른 문제가 있는건가요???


    9년 전 link
  • astein
    astein

    두번째 코드에서 Z 계산과정 마지막에 +1이 있기 때문에
    불가능한 경우가 아닐 것 같습니다


    9년 전 link
  • astein
    astein

    혼선을 드려서 죄송합니다. 코드를 잘못 읽었네요.

    아래코드에서 오답을 출력하는 예제를 하나 올려드리겠습니다.


    1700 493


    9년 전 link
  • astein
    astein

    테스트하면서 자기의 답에서 오류가 나오는 데이터를 직접 찾아보는것도 좋은 공부라고 생각합니다 :) 랜덤 데이터 제네레이터를 만들어서 테스트 하는 것이 그 중 쉬운 한 가지 방법이지요...


    9년 전 link
  • Being
    Being

    네, 손으로 넣어도 도저히 모르겠을 때는 입력을 생성해 보는 것도 한 방법입니다. :)


    9년 전 link
  • wondaebal
    wondaebal

    아 랜덤으로 데이터를 넣는것도 좋은방법이군요
    감사합니다! 문제를 해결하였습니다!


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