Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
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
Archives
Today
Total
관리 메뉴

DevDave

[Algorithm]백준1024<python>(sil2)Math 본문

Algorithm

[Algorithm]백준1024<python>(sil2)Math

Dave Song 2022. 6. 23. 16:08

수열의 합 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 17153 4119 3402 26.145%

문제

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

입력

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

출력

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

예제 입력 1 복사

18 2

예제 출력 1 복사

5 6 7

예제 입력 2 복사

18 4

예제 출력 2 복사

3 4 5 6

예제 입력 3 복사

18 5

예제 출력 3 복사

-1

예제 입력 4 복사

45 10

예제 출력 4 복사

0 1 2 3 4 5 6 7 8 9

예제 입력 5 복사

1000000000 2

예제 출력 5 복사

199999998 199999999 200000000 200000001 200000002

<Code>

import sys

input = sys.stdin.readline

n,l = map(int,input().split())

i = l

while 1 :

    if i > 100:

        print(-1)
        break

    elif (n - i * (i - 1) / 2) >= 0:

        if (n - i * (i - 1) // 2) % i == 0:

            a = (n - i * (i - 1) // 2) // i
            # print(a)
            # print(i)
            for k in range(i):
                print(a, end=' ')
                a += 1

            break

        i += 1

    else:

        print(-1)
        break

<Insight>

 

  • 최소길이를 초기화하고 길이를 증가 시켜가며 조건에 맞는 시작 값을 맞는 방식으로 구현
  • 최소길이의 조건에 부합할때, 시작 원소를 필두로 필요한 길이 만큼 출력
  • 최소길이가 100이 넘어가면 조건에 부합하지 못해 -1을 출력해야하는데 이를 놓치는 바람에 시간이 걸림
  • 등차수열의 합