-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1484.py
44 lines (39 loc) · 2.18 KB
/
1484.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'''
풀이
문제를 접하고 현재 몸무게의 범위를 판단하는데 꽤 오랜 시간을 썼다...
주어진 조건에 의하면 현재 몸무게 ** 2 - 이전 몸무게 ** 2 = G 라는 조건이 성립한다.
현재 몸무게의 범위를 어디까지 잡아야 하는 것일까...?
1부터 n까지 n을 제외한 각 수의 제곱수와 n제곱수의 차를 구한다고 생각해보면
가장 큰 차이가 나는 값은 당연히 1제곱수와 n제곱수의 차일 것이고
가장 차이가 작은 값은 n-1제곱수와 n제곱수의 차일 것이다.
그럼, n제곱수 - n-1제곱수가 g를 넘지않는 n까지가 현재 몸무게의 범위로 생각할 수 있다.
이에 대한 식을 도출하기 위해 먼저, 각 수의 제곱수를 구하고 수들의 차를 구해보았다.
n = 1, 2, 3, 4
n^2 = 1, 4, 9, 16, ...
d = 3, 5, 7, ...
수들의 차가 공차가 2인 등차 수열이고 n = 2일 때 3이 되야하므로 2n - 1이라는 식이 나온다.
여기서, 주어진 g의 최대값 100,000을 만족하는 n을 구하면 50,001보다 작은 값이 나오므로
현재 몸무게 n의 범위는 50,000까지 탐색하면 된다는 것을 알 수 있다.
결국, 현재 몸무게의 범위가 50,000까지 이므로 완전 탐색은 불가능하다.
따라서, 좌측, 우측 시작 지점의 몸무게를 1로 잡고 투 포인터를 사용하여 50,000까지 탐색하면 된다.
두 몸무게의 제곱차와 g를 비교하여 g와 동일한 경우 현재 몸무게(우측 포인터)를 기록하고 다음 과정을 반복 수행한다.
제곱차 >= g 이면 몸무게의 차를 줄여야하므로 좌측 포인터를 1 증가시킨다.
제곱차 < g 이면 몸무게의 차를 늘려야하므로 우측 포인터를 1 증가시킨다.
'''
import sys
input = lambda: sys.stdin.readline().strip()
def solution():
answer = []
g = int(input())
l, r = 1, 1
while r < 50001:
diff = r ** 2 - l ** 2
if diff == g:
answer.append(r)
if diff >= g:
l += 1
else:
r += 1
print(*sorted(answer) if answer else [-1], sep='\n')
if __name__ == "__main__":
solution()