본문 바로가기
Problem Solving

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

by tls1107 2021. 7. 25.
728x90
반응형


문제 풀기 전 생각 : 

/*
약수의 숫자가 짝수인지 판별하는 함수를 만든다.
left부터 right까지 반복마다 
인수판별 함수를 이용해 짝수라면 해당 숫자를 더하고
아니라면 해당 숫자를 감소시킨다.
*/

#include <string>
#include <vector>
using namespace std;

int count_insu(int n){
    int count = 0;
    for(int i=1 ; i<=n ; i++){
        if( n%i == 0 ) count++;
    }
    return count;
}

int solution(int left, int right) {
    int answer = 0;
    for(int i=left ; i<=right ; i++){
        if(count_insu(i)%2 == 0) answer += i;
        else answer -= i;
    }
    return answer;
}

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

 

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

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

programmers.co.kr


풀 때 어려웠던 점 또는 느낀점 :

어려운 점은 없었다.

준비운동 느낌의 문제였다.


개선방안 :

int sign(int n, int count = 1) {
    for (int i = 1, last = n >> 1; i <= last; ++i) if (n % i == 0) ++count;
    return count & 1 ? -1 : 1;
}
int solution(int a, int b) { return a > b ? 0 : sign(a)*a + solution(a + 1, b); }

이 코드는 재귀함수로 짠듯하다. 

신박하네.

 

#include <vector>

using namespace std;

int solution(int left, int right) {
    int answer = 0;
    int count = 2;
    int check = 2;
    if(left == 1){
       answer -= left;
       left++; 
    } 
    for(left ; left <= right ; left++){
        for(count ; count < left ; count++){
            if(left % count == 0) check++;
        }
        (check & 1) ? answer -= left : answer += left;
        check = 2;
        count = 2;
    }
    return answer;
}

이 코드는 함수를 따로 안 만들고

접근법은 비슷한거 같다!

728x90
반응형

댓글