백준 1072 : 게임

JeongYeon-Kim·2023년 7월 19일
0

알고리즘

목록 보기
6/16
post-thumbnail
post-custom-banner

승률 z가 변하는 추가 판수가 몇 판인지 구하는 문제.
답이되는 판수를 mid로 놓고, 이분탐색을 진행해도 좋을 것 같았다.

그런데 문득 문제에서의 x,y,z와 추가로 진행하는 판 수를 a라고 할 때 아래처럼 식을 끄적여보았다.

추가로 게임을 진행했을 때의 승률은 Ź이다. 이 승률이 원래의 z와 값이 다르면 되기 때문에 이처럼 부등호를 두고 a에 대해 정리해보니 최종적으로 위와 같이 식이 나왔다.

99-z ??

왜 저런 제약이 생긴거지? 생각해보니...

처음 나온 승률이 우선 100일때는 더 승률이 변할 일이 없다.( 앞으로 항상 이기기만 하니까 )
처음 나온 승률이 99일 때는 승률 100이 되려면 모든 게임에서 이겨야 하는데, 첫 승률 책정 때 이미 진 판수 때문에 100을 절대 찍을 수 없다.
따라서 아래와 같은 제약사항 생성!

init_z = y *100 // x 
if init_z in (99,100):
	return -1

이후 저 식대로면, 최소 저만큼은 이겨야 승률이 변한다는 것.
다시말해 추가 판수가 2.3이 나왔다면, (판수는 자연수이니) 2판일 땐 변하지 않다가 3일 때는 변한다는 것!
따라서 a에 대한 부등식에서 우항을 올림해주었다.

method & output

## method
def sol(x,y):
    import math
    init_z = y *100 // x 
    if init_z in (99,100):
        return -1
    
    max = math.ceil(((init_z+1) * x - 100 * y) / (99 - init_z))
    
    return max
    
## input
x, y = map(int, input().split())

## output
print(sol(x,y))

아!!! 이때 주의할 것!!!!
처음엔 초기 승률을 계산할 때 무지성 int()를 씌워서 했었다.

int( ( y/x ) \*100)

근데 이렇게 계산하면 파이썬에서는 부동소수점 오류가 발생할 수 있다고 한다.

따라서 아래처럼 표현을 바꿔야한다.

  • int( (y\*100) / x )
  • ( y\*100 ) // x

이부분에서 낑낑 ;; 대다가 고치니까 되는..

다음부턴 소수에 대한 계산도 세심하게 고려를 해봐야겟다 ㅠㅠ

post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

소중한 정보 잘 봤습니다!

답글 달기