반응형
<문제 소개>
<소스 코드>
#include <string>
#include <vector>
using namespace std;
int solution(int n)
{
int answer = 1; // 자기자신은 세고 들어감
if(n != 1 && n % 2 != 0) answer++;
for(int i = 3; i <= n/2; i++)
{
if(n % i != 0) continue; // 나누어떨어지지 않으면 넘어감
int sum = 0;
int startNum = n/i - i/2;
for(int j = 0; j < i; j++)
{
sum += startNum++;
}
if(sum == n) answer++;
}
return answer;
}
<풀이과정>
1. 1번의 연속으로 자기자신을 항상 표현할 수 있으므로 answer을 1로 선언하고 시작한다.
2. 주어진 수 n이 1이 아닌 홀수라면 2번의 연속으로 자기자신을 항상 표현할 수 있으므로 answer을 1 증가시킨다.
3. n이 연속한 자연수들의 합으로 표현되려면 n의 약수를 찾고, 해당 약수를 가운데 둔 연속된 자연수들의 합만이 될 수 있다.
4. 따라서 3부터 n/2까지 반복하며 나누어떨어지지 않는 경우는 넘어가며 반복한다.
5. n값과 비교해서 연속된 수의 합이 n과 같은지를 판단한 연속된 수들의 합 sum을 선언하고, 연속된 자연수들이 시작되는 수인 startNum을 선언한다.
6. 이때, 연속되는 수는 i개이므로 startNum은 n을 i로 나눈 몫에서 i/2를 빼준 수가 된다.
7. 이후 0부터 i번 반복을 진행하며 startNum을 하나씩 증가시키면서 sum에 더해주고 마지막에 n과 비교하여 맞다면 answer을 증가시킨다.
8. 위의 반복이 모두 끝나고 나온 answer을 리턴한다.
<코멘트>
뭔가 헷갈렸다. 좀 더 명확하고 간결하게 풀고 싶었는데 잘 되지 않았다.
풀이를 설명하는것도 어렵다.ㅋㅋ
풀고나니 내 생각대로의 풀이랑은 조금 달랐지만 논리상 비슷하고 맞긴했다.
내 풀이대로면 자연수를 생각안하고 음수부터 더해진다. 그런데 음수도 연속된 수라서 양수랑 1대1로 매칭되고 앞부터 없어지기 때문에 어차피 연속된 수가 된다.
<제출결과>