https://www.acmicpc.net/problem/25323
25323번: 수 정렬하기, 근데 이제 제곱수를 곁들인
양의 정수로 이루어진 길이가 $N$ 인 수열 $A_1,A_2,\cdots ,A_N$이 존재할 때, 다음 행동을 원하는 만큼 반복할 수 있다. $1\leq i,j\leq N;i\neq j$이면서 $A_i\times A_j$가 제곱수인 $i$, $j$를 선택해, $A_i$와 $A_j$
www.acmicpc.net
처음 입력 리스트와 내장함수 sort로 정렬된 리스트가 서로 곱해서 제곱근이 나오면 넘기고 아니면 멈추는 형식으로 만들어봤다.
math 함수에 math.sqrt를 써서 if int(math.isqrt(s[i]*an[i]))**2==s[i]*an[i]: 해줬는데 틀렸습니다를 받았다.
그후 이게 실수 오차인줄 알고if int(math.isqrt(s[i]*an[i])**2)==s[i]*an[i]: 제곱하고 int로 바꿔줬는데도 "틀렸습니다"를 받아서
인터넷에 검색해본 결과 math.sqrt말고 math.isqrt를 함수로 쓰면 된다고해 if int(math.isqrt(s[i]*an[i]))**2==s[i]*an[i]: 고쳤더니 AC를 받았다.
실수 오차 해결 방법 알게된 곳 : https://gall.dcinside.com/mgallery/board/view/?id=ps&no=25362
math.isqrt와 math.sqrt의 차이점이다. https://www.w3schools.com/python/ref_math_isqrt.asp
print (math.sqrt(16777217)**2)
print (math.isqrt(16777217)**2)를 비교해보면 좋을것 같다.
import math
n = int(input())
s = list(map(int,input().split()))
an = s.copy()
s.sort()
e=0
for i in range(n):
if int(math.isqrt(s[i]*an[i]))**2==s[i]*an[i]:
pass
else:
e =1
break
if e==1:
print("NO")
else:
print("YES")
도움 되셨으면 공감 한번만 눌러주세용...
'백준 파이썬 코딩' 카테고리의 다른 글
백준 1987 알파벳 파이썬 (2) | 2022.08.13 |
---|---|
백준 2096 내려가기 파이썬 (0) | 2022.08.13 |
백준 1195 킥다운 파이썬 최적화 X (0) | 2022.08.12 |
백준 13398 연속합 2 파이썬 (0) | 2022.08.11 |
백준 14500 테트로미노 파이썬 (무식한 방법) (0) | 2022.08.11 |