본문 바로가기

백준 파이썬 코딩

백준 25323 수 정렬하기, 근데 이제 제곱수를 곁들인 파이썬

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")

도움 되셨으면 공감 한번만 눌러주세용...