본문 바로가기

코딩 연습

프로그래머(약수의 개수와 덧셈)

문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ left ≤ right ≤ 1,000


1. left부터 right까지의 수를 구함
2. 그 수들의 약수를 구함
3. 약수의 개수가 짝수면 더하고 홀수면 뺌

 

문제를 보고 위처럼 구현 순서를 생각해서 작성을 했다.

#include <string>
#include <vector>

using namespace std;
// 1. left부터 right까지의 수를 구함
// 2. 그 수들의 약수를 구함
// 3. 약수의 개수가 짝수면 더하고 홀수면 뺌
int solution(int left, int right)
{
    int answer = 0;
    vector<int> num = {};
    
    for(int i = left; i <= right; ++i) // i가 left부터 right까지의 수
    {
        for(int j = 1; j <= i; ++j)
        {
            if(i % j == 0) // 약수 구하기
            {
                num.push_back(j);
            }
        }
        if(num.size() % 2 == 0) // 약수의 개수가 짝수면 더하고 홀수면 뺌
        {
            answer += i;
        }
        else
        {
            answer -= i;
        }
    }
    return answer;
}

코드 실행을 했더니 결과값과 기댓값이 달랐다.

그래서 비쥬얼스튜디오에서 최근에 배운 디버깅을 하여 어디가 문제인지 찾아봤다.

i가 증가할 때 num이 초기화가 안되고 size가 2임

디버깅을 해본 결과 i가 증가할 때 num 벡터의 원소가 초기화 되지 않고 누적이 되는것이 확인됐다.

그래서 바깥의 for문 마지막에 num 벡터 초기화를 추가했다.

#include <string>
#include <vector>

using namespace std;
// 1. left부터 right까지의 수를 구함
// 2. 그 수들의 약수를 구함
// 3. 약수의 개수가 짝수면 더하고 홀수면 뺌
int solution(int left, int right)
{
    int answer = 0;
    vector<int> num = {};
    
    for(int i = left; i <= right; ++i) // i가 left부터 right까지의 수
    {
        for(int j = 1; j <= i; ++j)
        {
            if(i % j == 0) // 약수 구하기
            {
                num.push_back(j);
            }
        }
        if(num.size() % 2 == 0) // 약수의 개수가 짝수면 더하고 홀수면 뺌
        {
            answer += i;
        }
        else
        {
            answer -= i;
        }
        num = {}; // 벡터 초기화
    }
    return answer;
}

수정 후 실행하니 결과값과 기댓값이 같았다.

 

최근에 디버깅을 배웠는데 이런 문제가 생겼을 때 사용해서 해결을 하니 재밌고 실력이 성장한 기분이다.