백준 1072 게임 (Python)

Joowan Park·2023년 7월 21일
0

코딩

목록 보기
4/28

아래는 내가 쓴 코드

import sys
import math
from decimal import Decimal
input = sys.stdin.readline
X,Y = map(int,input().split())
Z = int(Decimal(Y* 100/X)) 
if Z == 99 or Z == 100:
    print(-1)
else:
    a = Decimal((100*Y - X - Z*X)/(Z-99))
    result = Decimal(int((100*Y - X - Z*X)/(Z-99)) )
    if result - a == 0:
        print(result)
    else:
        print(result + 1)

역시 이런 문제는 부동소수점을 보았을 때 오차가 생길 수 있는데,
그것을 얼마나 "잘" 컨트롤 하느냐에 따른 것 같다.

Decimal을 활용하여 최대한 오차가 없도록 유의했다.
한편, if 이후의 식인데 이는 평범하게 방정식을 풀은 것으로,

Z <= 100*Y / X < Z+1 로 주어진 상황에서
Z + 1 <= 100(Y+a)/(X+a)가 되는 "최소의" a 를 찾는 것 이므로,
사실 그렇게 어려운 상황은 아니다.

위의 방정식을 풀다보면, (Z-99) or (99-Z)가 나올 수 있는데,
이 점이 가능 / 불가능을 나누는 Boundary가 되겠다.

profile
Complex Dynamics에서 탈출한 원숭이

0개의 댓글