def solution(n):
cnt = 0
# i부터 j까지의 합
for j in range(n//2+1, 0, -1):
for i in range(j-1, -1, -1):
if j*(j+1)/2 - i*(i+1)/2 == n:
cnt += 1
break
return cnt+1
처음에 이렇게 풀었다.
1부터 j까지의 합에서 1부터 i까의 합을 빼서 값이 n이 되면 카운트업하는 방식으로.
하지만 이 방식은 정확도는 100인데 효율성은 0이다..
def solution(n):
cnt = 0
# i부터 j까지의 합
for j in range(n//2+1, 0, -1):
for i in range(j-1, -1, -1):
if j*(j+1)/2 - i*(i+1)/2 > n:
break
if j*(j+1)/2 - i*(i+1)/2 == n:
cnt += 1
break
return cnt+1
if j*(j+1)/2 - i*(i+1)/2 > n: break
이 코드를 추가해주면 효율성도 100이 된다!
j만큼의 수에서 점점 작은 i까지의 합을 빼는 것이기 때문에 이 뺀 값도 n보다 크다면 i보다 작은 수의 합을 더해 뺐을 때는 값이 더 커질 것이기 때문에 그 이후는 볼 필요가 없다!
break하면 해당 for문 탈출해서 더 밖에 for문 이어서.