문제
1072번 - 게임
문제 해결 과정
- 방정식을 통해 해결하라
- 올림, 반올림, 버림을 잘 사용하라 (
math
)
- 반올림: .round()
- 올림: .ceil()
- 버림: .trunc()
- 내림: .floor()
- int형끼리 나누면 int형으로 소수점은 버려진다
시행 착오
- 예제는 통과했지만 시간 초과 -> 방정식을 사용하라..
import sys
import math
x, y = map(int, sys.stdin.readline().split())
z = math.trunc(y / x * 100)
new_x = x
new_y = y
while True:
if math.trunc(new_y / new_x * 100) != z:
print(new_x - x)
break
if new_x == new_y:
print(-1)
break
new_x = new_x + 1
new_y = new_y + 1
- 방정식을 풀어서 식을 만들었는데 버림과 반올림만 생각하고있어서 정답이 제대로 안나옴. 소수점이하값들이 존재할 때
ceil
올림을 해줘야 함
-z = int(y / x * 100)
이 아닌 int(y * 100 / x)
으로 식을 세워야 함
x
, y
가 int형이기 때문에 y / x
에서 소수점 이하 값들은 버려지기 때문에
- 실수의 연산은 부정확할 수가 있으므로 사용에 주의해야 함
- 무한 소수가 나올 수 있지만, 컴퓨터 연산의 메모리는 이를 정확히 커버할 수 가 없으므로 예상과는 다른 결과가 나올 수 있음
z = int(y * 100 / x)
으로 식을 세우면 ZeroDivisionError
에러가 떠서 try~catch
로 예외 처리해줌
풀이
import sys
import math
x, y = map(int, sys.stdin.readline().split())
z = int(y * 100/ x)
try:
if x == y:
print(-1)
else:
print(math.ceil((100*y-((z+1)*x))/(z-99)))
except ZeroDivisionError:
print(-1)