140. 게임

아현·2021년 7월 7일
0

Algorithm

목록 보기
141/400

백준




1.Python

  • 답은 잘 나오나, 백준에서 틀렸다고 나온다.


INF = int(1e9)
x, y = map(int, input().split())


z = y * 100 // x

if z == 100 or z == 99: #진게 없어야 100이 되니까
  print(-1)

bottom = 1
top = INF
answer = INF

while bottom <= top:
  mid = (bottom + top) // 2
  next = (y + mid) * 100 // (x + mid)

  if z < next:
    if mid < answer:
      answer = mid

    top = mid - 1
  
  else:
    bottom = mid + 1

print(answer)





import sys
input = sys.stdin.readline

x, y = map(int, input().rsplit())
victory = y * 100 // x
ans = sys.maxsize
l, r = 1, x


while l <= r:
    mid = (l + r) // 2

    curr_vic = (y + mid) * 100 // (x + mid)
   
    if curr_vic > victory:
        ans = min(mid,ans)
        r = mid - 1
    else:
        l = mid + 1

if ans == sys.maxsize:
    print(-1)
else:
    print(ans)    

아래 코드도 INF로 변환해서 푸니 틀렸다고 나온다.

아마 최대값만큼 INF를 지정했는데 이를 -1로 반환해서 그런 것 같다.
INF를 잡으려면 +1을 해주던가 sys.maxsize로 아예 크게 잡는 것도 괜찮을 것 같다.





2.Java


import java.io.*;
import java.util.*;

public class Main {
    private static long X, Y, Z;    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        X = Long.parseLong(st.nextToken());
        Y = Long.parseLong(st.nextToken());

        Z = Y * 100 / X;
        if (Z == 100 || Z == 99) {
            System.out.println(-1);
            return;
        }
        // 이분 탐색으로 진행
        long bottom = 1, top = 1000000000, mid;
        long answer = 1000000000;
        while (bottom <= top) {
            mid = (bottom + top) / 2;
            long nextZ = (Y + mid) * 100 / (X + mid);
            if (Z < nextZ) {
                if (mid < answer) {
                    answer = mid;
                }
                top = mid - 1;
            }
            else {
                bottom = mid + 1;
            }
        }
        System.out.println(answer);
        //System.out.println("Z : " + Z);
        //System.out.println("NEXT Z : " + (Y + answer) * 100 / (X + answer));
        /*
        // 경기횟수가 정수 범위를 벗어 난다면??????
        for (int i = 1 ; ; i++) {
            long nextZ = (Y + i) * 100 / (X + i);
            double tmp = (double)(Y + i) * 100 / (X + i);
            System.out.println(tmp);
            if (nextZ != Z) {
                System.out.println(i);
                break;
            }
        }
        */
    }   
}
profile
Studying Computer Science

0개의 댓글