본문 바로가기
알고리즘/백준

[백준 1072 / 게임 / JAVA / 이분 탐색]

by KDW999 2023. 5. 10.

https://www.acmicpc.net/problem/1072

 

1072번: 게임

김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시

www.acmicpc.net

 

문제 접근

다른 건 어렵지 않게 해결했으나 승률을 지정하는 방법에서 막혔다.

처음에 승률을 지정할 때 (double)Y  / (double)X * 100로 지정해주었으나 이렇게 했을 경우 Y에 비해 X가 너무 크면 100을 곱하기도 전에 값이 0.000000..... 에 가까워져서 안된다고 하더라

그래서 (double)Y * 100 / (double)X 이렇게 100을 앞으로 당겨와서 곱해야 한다고 하더라

 

승리 횟수 구하는 과정

mid를 이긴 횟수와 전체 게임횟수에 똑같이 추가

이겼을 때 승률이 변하는가? 변하면 그 때의 승리 횟수를 저장, 더 적은 횟수로 이길 수 있는 지 체크하기 위해 right 당기기
변하지 않는다면 left를 당겨서 승리 횟수 증가시키기

 

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

public class Main {
	public static void main(String[] args) throws IOException  {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int X = Integer.parseInt(st.nextToken()); // 게임 횟수
		int Y = Integer.parseInt(st.nextToken()); // 게임 이긴 횟수
		
		long winRate = (long)Math.floor((double)Y * 100 / (double)X );
	
		long left = 1;
		long right = 1000000000;
		long result = -1;
		while(left <= right) {
			long mid = (left + right) / 2; 
			
			long newRate = (long)Math.floor((double)(Y+mid)* 100 / (double)(X+mid) );
			
			if(newRate > winRate) {
				result = mid;
				right = mid - 1;
			}
			else if(newRate <= winRate) {
				left = mid + 1;
			}
		}
		System.out.println(result);
	}
}

댓글