여니의 취준 준비/코딩테스트 (Python)

[1024] 수열의 합 In python

여니's 2022. 2. 12. 18:17

 

> 수학 알고리즘

 

규칙을 찾아 푸는 문제

https://danco.tistory.com/30

 

[1024] 수열의 합

https://www.acmicpc.net/problem/1024 처음에 나누는 수 L을 짝수일 때, 홀수일 때로 나눠서 나온 수를 수열의 가운데 있는 숫자라고 정하고, 그 수 앞뒤로 연속되는 숫자를 출력하는 방식으로 했는데 94%에

danco.tistory.com

 

위 블로그에 규칙 정리가 잘 되어 있어서 펌해왔음.

 

n= 18, L=2일 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
출력값은 5,6,7

 

연속된 숫자의 합이 n과 같아져야 하고

그 연속된 숫자의 길이가 가장 짧아야한다.

 

위 과정을

수식으로 정리하면

아래와 같다.

n=(x+1)+(x+2)+...(x+L)
n=l*x+(1+2+...L)
n=x*l+t  # t = L(L-1)//2
x=(n-t)//L

 

이때,

x는 정수여야한다.

따라서 (n-t)가 L로 딱 나누어 떨어져야 하고,

x의 값, 즉 (n-t)//L의 값이 0 이상이어야 한다.

 

 

x가 정수라는 걸 입증하는 수식이라는 걸 해석하는데 오래 걸림

n, l = map(int, input().split())
length = 0
x=-1

for i in range(l, 101):
    t = (i * i - i) // 2
    if (n-t)%i==0 and (n-t)//i>=0:
        x=(n-t)//i
        length=i
        break
if x==-1:
    print(-1)
    exit()
else:
    answer=[]
    for i in range(length):
        answer.append(int(x+i))
    print(*answer)