G=int(input())
#G=cur**2 - past**2
res = []
past, cur = 1,2
while past<cur and cur+past<=G:
tmp = cur**2-past**2
if tmp==G:
res.append(cur)
past+=1
cur+=1
elif tmp<G:
cur+=1
else:
past+=1
if res:
for i in res:
print(i)
else:
print(-1)
투포인터로 바로 풀 수 있는 문제다. 다만 종료 조건을 어떻게 해야할지를 고민했는데, G=cur^2-past^2=(cur-past)*(cur+past)이며, cur,past는 모두 자연수이고 cur>past가 자명하므로 (G>=1이기 때문에) G=n*m(m>n)이라고 할때 n보다 큰 m값은 항상 cur+past가 된다. G를 자연수의 곱셈으로 나타날때 가장 큰/작은 숫자가 나오는 경우의 수는 1*G의 경우의 수이므로, cur+past<=G여야한다. 그래서 이걸 종료조건으로 잡고 코드를 작성해줬다. 그런데 8퍼센트쯤에서 자꾸 틀려서 뭐가 문제인가 했더니 답이 없을때 -1 출력해줘야하는걸 놓침..ㅎㅎ.. 문제를 꼼꼼히 읽자..