반응형
프로그래머스 약수의 개수와 덧셈을 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로 풀어보겠다.
반응형
'Coding Test > C++' 카테고리의 다른 글
[프로그래머스] 2016년 C++ Code (0) | 2022.08.20 |
---|---|
[프로그래머스] 성격 유형 검사하기 C++ Code (7) | 2022.08.19 |
[프로그래머스] K번째수 C++ Code (2) | 2022.08.16 |
[프로그래머스] 체육복 C++ Code (0) | 2022.08.10 |
[프로그래머스] 예산 C++ Code (0) | 2022.08.10 |
댓글