알고리즘 공부(C++)

백준 2417 정수 제곱근

혀니리리 2022. 9. 3. 14:19
728x90

2417번: 정수 제곱근 (acmicpc.net)

 

2417번: 정수 제곱근

정수가 주어지면, 그 수의 정수 제곱근을 구하는 프로그램을 작성하시오.

www.acmicpc.net

여러모로 날 빡치게했던 이번 문제..

계속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