728x90
여러모로 날 빡치게했던 이번 문제..
계속86까지 진행됐다가 틀렸다고 떴ㄷㅏ..
찾아보니까 부동소수점에 해당하는 케이스땜에 틀렸다고 하는것임..
파이썬은 float계산에서 오류를 많이 발생시킨다고 하는데
고정 소수점과는 달리 부동소수점은 <뜰 부, 동작할 동>
안 움직인다는게 아니고 움직이는 소수점이라는것임
사실 피자를 자를때도 정확히 8등분이 아니라 한 조각이 7.99994564352434243 등분일수 잇지 않은가
그렇기 때문에 float계산에서 사실 67108864.00000000000002423435435인데 이럴 때 파이썬에서는 메모리 보호 차원에서도 그렇고 67108864.0으로 어림짐작해서 뒤에 값을 버려 버리기 때문에 내가 짠 코드같은 경우에 오류가 날 수 있던 것.
import decimal
n = int(input())
e = decimal.Decimal(str(n))
if e.sqrt() == int(e.sqrt()):
print(int(e.sqrt()))
else:
print(int(e.sqrt()) + 1)
그럴 땐 이런 식으로 decimal.Decimal(str(n)) 처럼 쓰면 정확한 정수값이 나온다고 함.
중요한 것은
1.n을 str로 변경한 후 decimal씌울 것
2.decimal을씌운 뒤에 sqrt를 할 것
3.math.sqrt함수 대신 내장 함수 .sqrt()를 사용할 것...
이외에도 ** 0.5 한 것을 다시 ** 2해서 비교하는 등의 방법도 있더라..
일단 부동소수점을 알아두는 것에 의의를 두는 것으로 하자.
728x90
'알고리즘 공부(C++)' 카테고리의 다른 글
백준 1935 후위 표기식2 ( stack ) (0) | 2022.09.05 |
---|---|
백준 1874 스택 수열 (0) | 2022.09.04 |
백준 1158 요세푸스 문제 - 큐 (0) | 2022.09.03 |
백준 10816 숫자카드 2 - 딕셔너리 (0) | 2022.09.02 |
백준 1764 듣보잡 - 차집합 (0) | 2022.09.02 |