코딩테스트 연습 기록

이종길·2022년 2월 25일
0

코딩테스트 연습

목록 보기
86/128

2022.02.25 62일차

백준 1072번 (게임)

문제

김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시작했다. 의심을 피했다고 생각한 형택이는 다시 게임을 켰다. 그 때 형택이는 잠시 코딩을 하는 사이에 자신의 게임 실력이 눈에 띄게 향상된 것을 알았다.

이제 형택이는 앞으로의 모든 게임에서 지지 않는다. 하지만, 형택이는 게임 기록을 삭제 할 수 없기 때문에, 자신의 못하던 예전 기록이 현재 자신의 엄청난 실력을 증명하지 못한다고 생각했다.

게임 기록은 다음과 같이 생겼다.

게임 횟수 : X
이긴 게임 : Y (Z%)
Z는 형택이의 승률이고, 소수점은 버린다. 예를 들어, X=53, Y=47이라면, Z=88이다.

X와 Y가 주어졌을 때, 형택이가 게임을 최소 몇 번 더 해야 Z가 변하는지 구하는 프로그램을 작성하시오.

나의 풀이

  1. 이분탐색 활용해서 퍼센트가 변하는 최소값 구하기
  2. min = 1, max = 기존 전체 게임 횟수
  3. 이길때마다 전체 게임 횟수도 더하면서 확률 변화 구하기
  4. 기존 퍼센트와 같지 않을 때 answer에 값 할당, max = mid - 1로 변경
  5. 나머지 경우 min = mid + 1로 변경
import java.io.*;
import java.util.*;

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());

        long x = Integer.parseInt(st.nextToken());
        long y = Integer.parseInt(st.nextToken());
        int per = (int)((y * 100) / x);


        long min = 1;
        long max = x;
        long answer = -1;

        while (min <= max) {
            long mid =(max + min) / 2;
            int temp = (int)(((mid + y) * 100) / (x + mid));

            if (temp != per) {
                answer = mid;
                max = mid - 1;
            } else {
                min = mid + 1;
            }
        }

        System.out.println(answer);
    }
}

생각하기

  • 범위 커지면 오류날 확률 높음, 최대한 작게 접근
  • 퍼센트 구하는 법
int percent = (int)((y * 100) / x);
profile
Go High

0개의 댓글

관련 채용 정보