📌문제 설명
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
이 블로그를 보면서 이해를 많이 할 수 있었던 거 같다.
'알고리즘 > 문제풀이 :백준' 카테고리의 다른 글
[백준][c++] 1002-터렛 (0) | 2025.04.13 |
---|---|
[백준][JAVA] 2493 탑 (1) | 2025.01.20 |
[백준][Java] 10799 - 쇠막대기 (1) | 2025.01.15 |
[백준][JAVA] 2579 계단 오르기 (0) | 2025.01.06 |