정수 배열 nums가 있다고 가정하고 정확히 4개의 제수가 있는 해당 배열에서 정수의 제수의 합을 찾아야 합니다. 따라서 배열에 그러한 정수가 없으면 0을 반환합니다. 예를 들어 입력이 [21, 4, 7]이면 출력은 32가 됩니다. 21은 4개의 제수 1, 3, 7, 21, 4는 3개의 약수 1, 2, 4, 7은 2개의 약수 1과 7을 가집니다. 답은 21의 약수만 합한 것입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
ok()라는 메서드를 정의하면 x가 입력으로 사용됩니다.
-
ret :=1 + x, cnt :=2
-
i의 경우 :=2, i^2 <=x, i를 1 증가
-
x가 i로 나누어 떨어지는 경우
-
ret를 i만큼 증가, cnt를 1만큼 증가
-
i가 x/i가 아니면 cnt를 1만큼 증가시킵니다. ret :=ret + (x/i)
-
-
-
cnt가 4이면 ret를 반환하고 그렇지 않으면 0을 반환
-
주요 방법에서
-
ret :=0, n :=숫자 크기
-
0 ~ n – 1 범위의 i에 대해
-
렛 :=렛 + ok(숫자[i])
-
-
리턴 렛
예시(C++)
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class Solution { public: int ok(int x){ int ret = 1 + x;; int cnt = 2; for(int i = 2; i * i <= x; i++){ if(x % i == 0){ ret += (i); cnt++; if(i != x / i){ cnt++; ret += (x / i); } } } return cnt == 4 ? ret : 0; } int sumFourDivisors(vector<int>& nums) { int ret = 0; int n = nums.size(); for(int i = 0; i < n; i++){ ret += ok(nums[i]); } return ret; } }; main(){ vector<int> v = {21,4,7}; Solution ob; cout << (ob.sumFourDivisors(v)); }
입력
[21,4,7]
출력
32