저 수학과 나왔는데 RATIO 문제를 못풀고 있네요 ㅋㅋㅋㅋ;;;

  • tnehtanf
    tnehtanf

    Winner Rate = M / N * 100 입니다.

    일단 100% 가 나오는.. (M==N) 인 경우는 제외하고,

    정수부분과 소수부분으로 나눠서

    M / N * 100 = r + e ...(0<=e<1), (0<=r<100) in Z

    으로 표현 가능합니다.

    이후에 답을 찾기 위한 방법으로 수식을 풀어보면

    (M+x)/(N+x)*100 >= r+1 을 만족하는

    가장 작은 정수 x 를 구하면 됩니다.

    위 수식을 잘 정리하면

    x >= { (r+1)*N - 100*M } / (99-r) ...(r != 99)

    이 됩니다.

    여기서 % 값을 소수점 이하 버리기로 계산하기 때문에

    99% 인 경우는 100%가 되는 것이 불가능하고

    그래서 첫 r 이 99 이상이면 pass..

    정말 그냥 저렇게 풀어봤어요... 하..하하...

    자료형의 문제점을 딛고 이게 답이다! 라고 생각했지만

    3번의 오답 후...

    질문 드립니다.

    대체 뭐가 문제인지 알수가 없네요.

    한줄기 빛.. 부탁드립니다. 꾸벅.

    import java.util.Scanner;

    public class Main
    {
    private static int Answer;
    private static int C;
    private static double N;
    private static double M;

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
    
        C = sc.nextInt();
    
        for( int testcase = 0 ; testcase < C ; testcase++ )
        {
            N = sc.nextDouble();
            M = sc.nextDouble();
    
            double rate = M / N * 100;
    
            int nRate = (int)rate;
    
            if( nRate >= 99 )
            {
                Answer = -1;
            }
            else
            {
                double temp = ( (nRate + 1) * N - (100 * M) ) / (99 - nRate);
                Answer = (int)(temp);
    
                if( temp - Answer > 0 )
                    Answer++;
            }
    
            System.out.println(Answer);
        }
    }

    }


    8년 전
4개의 댓글이 있습니다.
  • SuperMan
    SuperMan

    부동소수점 연산에 대해서 좀 생각해봐야 하지 않을까 싶네요.


    8년 전 link
  • jeapi
    jeapi

    저는 이문제 풀때, 이진탐색을 사용해서 풀었던 기억이 있는데요..
    (M+x)/(N+x)*100 >= r+1 을 만족하는 x를 이진탐색으로 구해보시는게 어떤가요?


    8년 전 link
  • icuris
    icuris

    꼭 double로 입력을 받아서 rate를 구할 필요가 있을까요..?


    8년 전 link
  • Being
    Being

    수학과 출신이라시니까 주제넘게 조금 더 설명을 드리자면:

    실수 집합은 uncountable set이라 이산적인 기계인 컴퓨터에서는 표현이 불가능합니다. 뭐 어떻게 표현한다 치더라도 그리 실용적이지는 않고요. 그래서 소위 "scientific notation"이라 부르는 부동소수점 연산을 통해 실수를 표현하게 되는데, 이게 전체 실수 집합을 커버하는 것은 당연히 아니고, 굉장히 드문드문 표현하기 때문에 정밀도가 필요한 경우에는 그냥 사용하기 어려운 경우가 가끔 있습니다. 조금 더 생각해보면 사실 이 문제에서 다루는 수는 유리수에 한정되는데.. 힌트는 여기까지만 드리겠습니다.


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