본문 바로가기
알고리즘연습/백준

[BOJ] 1024번 수열의 합 파이썬

by 밈밈무 2022. 9. 3.

문제

N과 L이 주어질 때, 합이 N이면서, 길이가 적어도 L인 가장 짧은 연속된 음이 아닌 정수 리스트를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

출력

만약 리스트의 길이가 100보다 작거나 같으면, 연속된 수를 첫째 줄에 공백으로 구분하여 출력한다. 만약 길이가 100보다 크거나 그러한 수열이 없을 때는 -1을 출력한다.

풀이

#수학

처음에는 i*n+x = N 쪽으로만 생각을 해서 N이 최대값일 때 (1000000000) 제대로 동작하지 않았다.

그래서 반대로 n = (N-x)/i 의 방향으로 생각을 바꿔서 풀었다.

여기서 x는 1부터 L-1까지 더한 값으로 식으로 (L-1)L/2가 된다.

코드

N, L = map(int, input().split())

n = 0
x = 0
count = 0

for i in range(L, 101):
    x = (i-1)*i/2
    if (N-x)%i==0 and (N-x)/i>=0:
        n = (int)((N-x)/i)
        count = i
        break

if count==0:
    print(-1)
else:
    for i in range(count):
        print(n+i, end=" ")

'알고리즘연습 > 백준' 카테고리의 다른 글

[BOJ] 3055번 탈출 파이썬  (0) 2022.09.10
[BOJ] 1374번 강의실 파이썬  (0) 2022.09.07
[BOJ] 1058번 친구 파이썬  (0) 2022.09.01
[BOJ] 5567번 결혼식 파이썬  (0) 2022.08.23
[BOJ] 3187번 양치기 꿍 파이썬  (0) 2022.08.23