본문 바로가기
Coding Test/C++

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

by giem 2022. 8. 17.
반응형

 

프로그래머스 약수의 개수와 덧셈을 C++로 풀어보겠다.

2022.08.17 - [Coding Test/Go] - [프로그래머스] 약수의 개수와 덧셈 Go Code

2022.08.17 - [Coding Test/JavaScript] - [프로그래머스] 약수의 개수와 덧셈 JavaScript Code

2022.08.17 - [Coding Test/C++] - [프로그래머스] 약수의 개수와 덧셈 C++ Code

2022.08.17 - [Coding Test/Python] - [프로그래머스] 약수의 개수와 덧셈 Python Code

다른 언어 풀이는 위 링크를 참고하길 바란다.


문제


구현

for문으로 left부터 right까지 반복하며

약수의 개수가 홀수인 경우는 완전 제곱수이기 때문에

제곱수를 판별한 후

해당 숫자를 정답에서 빼거나 더한다.


코드
#include <string>
#include <vector>
#include <cmath>

using namespace std;

int solution(int left, int right) {
    int answer = 0;

    for(left ; left <= right ; left++){
        if(sqrt(left) == (int)sqrt(left))
            answer -= left;
        else
            answer += left;
    }
    return answer;
}

완전 제곱수를 판별한 방법은 위 코드와 같다.

루트를 취한 다음 int로 형 변환을 하고

그냥 루트를 취한 값과 같아지는지 확인했다.

 

결국, 루트값이 정수인지 판별한 것이다.


다른 풀이

다른 풀이에 함수를 하나 더 떠서 짧게 푼 풀이가 있었다.

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); }

복잡해 보이지만 로직은 같다. 

 

흥미로운 점은 재귀 호출과 bit operation을 사용한 점인데

 

짧은 코드임에도 불구하고 내 실력이 부족한 건지

코드가 한 눈에 들어오지 않아서 코드를 follow 하는 게 약간 걸렸다.

 

숏 코딩을 좋아하지만 가독성 또한 중요하다고 생각하는 취향이지만

이렇게 짜는 것도 재미있다.

 

다음 포스트에서는 Go로 풀어보겠다.

반응형

댓글