IT recording...
[BOJ] 1072 두 배열의 합 - python 본문
풀이
|
틀린 코드
더보기
import sys
def input():
return sys.stdin.readline().rstrip()
#print(int(47/53*100))
X,Y = map(int,input().split(" ")) # X:게임횟수, Y:이긴게임
Z = int(Y/X *100)
initZ = Z
#print(Z)
answer = 0
if X == Y:
print(-1)
exit()
#무조건 이기니까 다 돌려보고 변하는 순간 캐치하기 -> 시간이 될까?
while True:
Y += 1
X += 1
answer += 1
Z = int((Y)/(X)*100)
if Z > initZ:
break
print(answer)
최종 코드
import sys
def input():
return sys.stdin.readline().rstrip()
X,Y = map(int,input().split(" ")) # X:게임횟수, Y:이긴게임
#파이썬에서 부동소수점 문제 때문에 int((Y/X)*100)으로는 정확한 답이 나오지 않는다.
Z = int((Y*100/X))
initZ = Z
if Z >= 99:
print(-1)
exit()
#추가로 이긴 횟수를 변수로 이분탐색 시작
start,end,newZ = 0, 1000000000, Z
answer = end
#start,end가 같아질 때 까지 수행(->이전에 생성된 mid는 start,end값과 동일한 값)
#start > end면 종료
while start <= end:
mid = (start+end) // 2
newZ = (Y+mid)*100 // (X+mid)
if newZ > Z:
answer = min(mid,answer)
end = mid - 1
else:
start = mid + 1
print(answer)
얻어가는 것
- 파이썬의 부동소수점 오차 문제→ 해결 방법
- import decimal decimal.Decimal('0.1') * 3 == decimal.Decimal('0.3') >>> True
- #if문 사용시 부동소수점 때문에 오차가 생길 수 있다. 0.1 * 3 == 0.3 >>> False
- 3항연산자
- print(answer if answer > 0 else -1)
느낀점
"211201"
소요 시간 : 1h
- 이분탐색을 이용하리라고는 생각지도 못한 곳에서 이분탐색이 나와서 놀랐다
- X가 대빵크다면 정렬되어있지 않아도, 이분탐색으로 사용할 수 있는 변수가 존재하는지 확인해보자!
'Algorithm' 카테고리의 다른 글
[BOJ] 10828 스택 - python (0) | 2021.12.06 |
---|---|
[BOJ] 7453 합이 0인 정수 - python (0) | 2021.12.02 |
[BOJ] 2143 두 배열의 합 - python (0) | 2021.12.02 |
[BOJ] 2096 내려가기 - python (0) | 2021.12.02 |
[BOJ] 1806 부분합 - python (0) | 2021.12.02 |
Comments