코딩테스트

백준 1027번 게임 C++풀이

5_솔방울 2022. 11. 29.

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

 

1072번: 게임

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

www.acmicpc.net

이제 형택이는 앞으로의 모든 게임에서 지지 않는다. 하지만, 형택이는 게임 기록을 삭제 할 수 없기 때문에, 자신의 못하던 예전 기록이 현재 자신의 엄청난 실력을 증명하지 못한다고 생각했다.(중략)
X와 Y가 주어졌을 때, 형택이가 게임을 최소 몇 번 더 해야 Z가 변하는지 구하는 프로그램을 작성하시오.

형택이의 승률이 변하는 게임의 횟수를 구하는 문제이다.

문제의 포인트

문제를 파악하고, 이를 통해 이분 탐색을 활용할 수 있는가?

코드

#include <iostream>

using namespace std;

long long int f(long long int x, long long int y)
{
    return y * 100 / x;
}

int main(void)
{
    long long int x, y;
    cin >> x >> y;

    long long int z = f(x, y);

    if (z >= 99)
    {
        cout << -1;
        return 0;
    }

    long long int left = 0;
    long long int right = x;

    long long int ans;

    while (left <= right)
    {
        int mid = (left + right) / 2;

        if (f(x + mid, y + mid) > z)
        {
            right = mid - 1;
            ans = mid;
        }
        else
            left = mid + 1;

        //cout << mid << endl;
    }

    cout << ans;

    return 0;
}

여담

이분탐색을 활용해야할지 약간 막막했다. 문제에 익숙해지고, 개념을 익히기 위해 나중에 lower_bound를 활용해 풀어보고 싶다.

댓글