초보 개발자의 이야기, 릿허브

[C++] 프로그래머스 약수의 개수와 덧셈 본문

코딩테스트/📘 프로그래머스 (programmers)

[C++] 프로그래머스 약수의 개수와 덧셈

릿99 2021. 9. 13. 09:00
728x90
반응형
1. 문제이해

https://programmers.co.kr/learn/courses/30/lessons/77884

 

코딩테스트 연습 - 약수의 개수와 덧셈

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

programmers.co.kr

 

두 정수 left와 right 사이의 모든 수들 중에서

약수의 개수가 짝수인것은 더하고, 홀수인것은 뺀 최종값을 리턴하는 것이 목표이다.

 

 

 

2. 문제풀이

 

두 정수 left와 right 사이의 수들의 약수의 개수를 판별하고,

약수의 개수가 짝수냐 홀수냐에 따라 가감하는 문제이다.

 

약수의 개수를 판별하기 위해, for문을 통해 1부터 해당 정수까지 차례로 나누고,

나누어떨어지면 약수로 판정, 약수의 개수값에 해당하는 변수의 값을 늘려주는 방식을 채택했다.

 

또한, left에서 right에 해당하는 모든 수들의 약수의 개수를 구해야 하기때문에,

for문을 하나 더 이용해 값을 하나씩 늘려가며 위의 과정을 반복하도록 했다.

 

주어진 틀은 다음과 같았다.

 

 

 

3. 소스코드
#include <string>
#include <vector>

using namespace std;

int solution(int left, int right) {
    int answer = 0;
    int count = 0;
    
    // left에서 right까지 num을 하나씩 늘려나가면서
    // 해당 num의 약수의 개수를 count 
    for(int num = left; num <= right; num++){  
        for(int i = 1; i <= num; i++){
            if(num % i == 0){ // 나누어 떨어지면 약수이므로
                count++; // 카운트
            }
        }
        
        // 해당 num에서의 count값을 가지고 가감 결정
        if(count % 2 == 0) { // 약수의 개수가 짝수
            answer += num;
        }
        else { // 약수의 개수가 홀수
            answer -= num;
        }
        count = 0;  // 카운트 값 초기화
    }
    
    return answer;
}

이중 for문을 통해 위와 같이 구현할 수 있었다.

첫번째(바깥쪽) for문을 이용해 left값부터 시작해 right값까지 num값을 하나씩 늘려가면서,

두번째(안쪽) for문을 통해 약수의 개수를 세주었다.

 

두번째 for문이 종료되었을 때 나온 약수의 개수(count)를 가지고,

약수의 개수가 짝수이면 answer 값에 더하고, 홀수이면 빼도록 했다.

 

이후, 약수의 개수(count)값을 0으로 초기화하고,

(초기화하지 않으면 count값이 계속 중첩되어 올바른 결과가 나오지 않게된다.)

첫번째 for문을 통해 num값을 증가시켜주고, 위와 같은 연산을 반복했다.

 

 

 


count값을 초기화해주지 않아 에러가 떠서 잠시 당황했었다..

역시 끝까지 긴장의 끈을 놓지 말아야지..🥵

 

 

 

 

 

728x90
반응형