본문 바로가기
코딩테스트 준비/프로그래머스

[프로그래머스][C++][2단계] 숫자의 표현

by 스테디코디스트 2023. 11. 7.
반응형

<문제 소개>


<소스 코드>

#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로 매칭되고 앞부터 없어지기 때문에 어차피 연속된 수가 된다.


<제출결과>