문제 설명
두 정수 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 벡터의 원소가 초기화 되지 않고 누적이 되는것이 확인됐다.
그래서 바깥의 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;
}
수정 후 실행하니 결과값과 기댓값이 같았다.
최근에 디버깅을 배웠는데 이런 문제가 생겼을 때 사용해서 해결을 하니 재밌고 실력이 성장한 기분이다.
'코딩 연습' 카테고리의 다른 글
프로그래머스(문자열 다루기 기본) (0) | 2025.09.04 |
---|---|
프로그래머스(콜라츠 추측) (1) | 2025.08.28 |
프로그래머스(정수 제곱근 판별) (2) | 2025.08.26 |
프로그래머스(문자열을 정수로 바꾸기) (1) | 2025.08.25 |