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

[백준 1072] 게임

by m2162003 2021. 6. 20.

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

 

1072번: 게임

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

www.acmicpc.net

 

투포인터 문제이다.

코드는 어렵지 않지만 투포인터를 떠올리긴 쉽진 않은거 같다 ㅠ

while문을 돌리면 TLE가 발행한다.

 

이 문제의 또다른 포인트는 롱롱과 인트 범위라고 생각하는데

승률을 구하는 경우 소수점 아래는 버림하므로 먼저 100을 곱하고 시작하는 게 맞다.

이 경우 분자의 최댓값이 10^9이므로 100을 곱하면 INT 범위를 넘어선다. 따라서 N과 D는 롱롱이 되어야 한다.

int getWinRate(long long d, long long n)
{
  return n * 100 / d;
}

 

++ 그리고 또 하나, 승률이 99퍼인 경우 아무리 여러 번 게임을 해도 승률이 100퍼가 될 수 없다.

 

정답 코드는 아래와 같다.

#include <stdio.h>

using namespace std;
long long x, y;
int result;

int getWinRate(long long d, long long n)
{
  return n * 100 / d;
}

int main(void)
{

  scanf("%lld%lld", &x, &y);
  int z = getWinRate(x, y);

  if (z >= 99)
    return !printf("-1\n");

  int start = 1, end = 1000000000;
  while (start <= end)
  {
    int mid = (start + end) / 2;
    int newZ = getWinRate(x + mid, y + mid);
    if (newZ == z)
    {
      start = mid + 1;
    }
    else
    {
      end = mid - 1;
      result = mid;
    }
  }

  printf("%d", result);
  return 0;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 14501] 퇴사  (2) 2021.07.01
[백준 1806] 부분합  (0) 2021.06.20
[백준 1948] 임계경로  (0) 2021.06.19
[백준 11779] 최소비용 구하기 2  (0) 2021.04.11
[백준 11780]플로이드2  (0) 2021.04.11

댓글