[#129][알고리즘][백준] 1024. 수열의 합

[백준] 1024. 수열의 합

문제 링크(https://www.acmicpc.net/problem/1024)

문제

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

입력

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

출력

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

예제 입력 1 

18 2

예제 출력 1 

5 6 7
C++풀이
#include <iostream>
using namespace std;
int main() {
 
    int N, L;
    int sum = 0;
    cin >> N >> L;
    
    for (int i = L; i <= 100; i++) {
        int K, C;
        K = N / i;
        
        if (i % 2 == 0) {
            // 수열의 길이가 짝수일 때
            if (N % i != (i / 2)) continue;
            C = K - ((i - 1/ 2);
        }
        else {
            // 수열의 길이가 홀수일 때
            if (N%i != 0continue;
            C = K - (i / 2);
        }
 
        if (C >= 0) {
            //i는 수열의 길이
            for (int j = 0; j < i; j++) {
                cout << C + j << " ";
            }
            cout << endl;
            return 0;
        }
        else break;
    }
 
    cout << -1 << endl;
    return 0;
}
 
cs

수열의 길이 L
수열의 합 N

수열의 길이(L)이 홀수일 때
예1) L = 3, N = 15인 수열은 4 5 6
중간수 = N/L = 15/3 = 5

예2) L = 7, N = 63인 수열은 6 7 8 9 10 11 12
중간수 = N/L = 63/7 = 9


수열의 길이(L)이 짝수일 때
예1) L = 4, N = 38인 수열은 8 9 10 11
중간 수 * L + (L/2) = N

예2) L = 6, N = 27인 수열은 2 3 4 5 6 7
중간 수 * L + (L/2) = N



댓글

가장 많이 본 글