알고리즘/문제풀이 :백준

[백준][c++] 1024-수열의 합

각쿄 2025. 4. 13. 11:44

📌문제 설명

https://www.acmicpc.net/problem/1024

 

N 과 L이 주어졌을 때 연속되는 숫자의 합이 N이고 숫자의 연속 개수가 최소 L 이상인 수열을 구하는 문제였다.

💡생각

처음에 덱을 사용해서 앞에서 부터 한개씩 더해주고 N을 초과한다면 앞에서 빼고 다시 뒤에 넣어주는 방식을 진행을 했는데 이렇게 하니까 최소의 개수를 구할 수 없었다.

🔥풀이

#include <iostream>

using namespace std;

/*
 * N = x + (x+1) + (x+2) + ---- + (x + (L-1))
 * N = (L * x) + (1+2+3+ ---- +(L-1))
 * N = (L * x) + t (t = 1+2+3---+(L-1))
 * t = (L+(L-1) / 2
 */

int main(){

    int N;
    int L;

    cin >> N >> L;

    int start = -1;
    int count = 0;

    for(int i = L; i <= 100; i++){
        int t = i * (i-1) /2;

        if((N - t) % i == 0 && (N - t) / i >= 0){
            start = (N - t) / i;
            count = i;
            break;
        }
    }
    if(start < 0){
        cout << start;
        return 0;
    }
    for(int i = 0 ;i < count; i++){
        cout << start + i << " ";
    }

}

현재 수학에 너무 약하다는 생각이 드는 거 같다. 생각을 할 때 수학과 관련해서 생각도 해보는 걸 버릇처럼 해야 다양한 방식으로 접근이 가능하겠다.

 

 


📕참고

https://miiinnn23.tistory.com/72

 

[백준] 1024번: 수열의 합 - C++

문제 N과 L이 주어질 때, 합이 N이면서, 길이가 적어도 L인 가장 짧은 연속된 음이 아닌 정수 리스트를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나

miiinnn23.tistory.com

이 블로그를 보면서 이해를 많이 할 수 있었던 거 같다.