사고쳤어요
[백준] 수열의 합(C++) 본문
링크: https://www.acmicpc.net/problem/1024
1024번: 수열의 합
첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.
www.acmicpc.net
문제
N과 L이 주어질 때, 합이 N이면서, 길이가 적어도 L인 가장 짧은 연속된 음이 아닌 정수 리스트를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.
출력
만약 리스트의 길이가 100보다 작거나 같으면, 연속된 수를 첫째 줄에 공백으로 구분하여 출력한다. 만약 길이가 100보다 크거나 그러한 수열이 없을 때는 -1을 출력한다.
풀이
N을 수열의 합으로 나타내기 위해서는 L이 짝수일 때와 홀수일 때로 구분하여 판단해야 한다.
먼저 L이 짝수일 때는 a, a+1 / a, a+1 / a+2 / a+3 과 같이 수열의 합이 나타나게 되는데 N을 L로 나누었을 때 소수점 부분이 정확히 5인 경우에만 수열의 합으로 나타낼 수 있다.
예를 들어 17을 2개의 수열의 합으로 나타내면 17/2 = 8.5이기 때문에 8, 9로 나타낼 수 있고 30을 4개의 수열의 합으로 나타내면 30/4 = 7.5이기 때문에 6, 7, 8, 9로 나타낼 수 있다.
다음으로 L이 3 이상의 홀수일 때는 a-1, a, a+1 / a-2, a-1, a, a+1, a+2 와 같이 수열의 합이 나타나게 되는데 각 수열의 합은 3a / 5a 이다. 따라서 N을 L로 나누었을 때 나머지가 0인 경우에 수열의 합으로 나타낼 수 있다.
예를 들어 21을 3개의 수열의 합으로 나타내면 21/3의 나머지는 0이기 때문에 6, 7, 8로 나타낼 수 있다.
코드
#include <iostream>
using namespace std;
int main(){
int N, L, answer = -1;
cin >> N >> L;
int i = L;
while(i <= 100){
if (i % 2 == 0){ // i가 짝수일 때는 N을 i로 나누었을 때 소수점 부분이 X.5가 되면 수열로 나타낼 수 있다.
double tmp = double(N) / i;
if (tmp != int(tmp) && tmp * 2 == int(tmp * 2)){ // tmp의 값은 정수가 아니면서 tmp * 2의 값은 정수인지 확인
answer = int(tmp) - (i / 2) + 1;
break;
}
}
else{ // i가 홀수일 때는 N이 i로 나누어 떨어졌을 때 수열로 나타낼 수 있다.
if (N % i == 0){
answer = N / i - (i / 2);
break;
}
}
i++;
}
if (answer < 0){ // answer이 음수일 경우에는 조건에 맞지 않고 더 이상 양수로 이루어진 수열을 구할 수 없다.
cout << -1;
return 0;
}
for (int j = 0; j < i; j++){
cout << answer << " ";
answer++;
}
cout << endl;
}
'백준 > Silver' 카테고리의 다른 글
[백준] 1389 케빈 베이컨의 6단계 법칙(C++) (0) | 2023.10.04 |
---|---|
[백준] 1181 단어 정렬(C++) (0) | 2023.06.27 |
[백준] 1012 유기농 배추(C++) (0) | 2023.03.08 |
[백준] 1402 아무래도이문제는A번난이도인것같다(C++) (0) | 2023.02.10 |
[백준] 1343 폴리오미노(C++) (0) | 2023.02.10 |