2023. 1. 11. 14:04ㆍJava/coding test
CountFactors
- Prime number
- 소수
- 1보다 큰 자연수이면서, 1과 자기 자신만을 약수로 가지는 수
- Composite number
- 합성수
- 1보다 큰 자연수이면서, 소수가 아닌 수
- Divisor, Factor
- 약수
- 어떤 수를 나누어 떨어지게 하는 수
A positive integer D is a factor of a positive integer N if there exists an integer M such that N = D * M.
For example, 6 is a factor of 24, because M = 4 satisfies the above condition (24 = 6 * 4).
Write a function:
class Solution { public int solution(int N); }
that, given a positive integer N, returns the number of its factors.
For example, given N = 24, the function should return 8, because 24 has 8 factors, namely 1, 2, 3, 4, 6, 8, 12, 24. There are no other factors of 24.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..2,147,483,647].
N = D * M
을 만족하는 정수 M이 존재한다 할때, 양수 D는 양수 N의 약수입니다.
6은 24의 약수
주어진 자연수 N의 약수를 반환하는 문제
1 <= N <= 2^31 - 1
int 자료형의 표혐범위를 넘어서는 부분에 대한 신경을 써야 합니다.
대칭 약수를 이용하여 문제를 이용하면 시간복잡도로 문제를 해결할 수 있습니다.
i를 1부터 증가시키면서, 제곱수가 N보다 작으면서 i가 N의 약수인지를 확인합니다.(N % i == 0
을 만족하면 i는 N의 약수)
만일 i가 약수일 경우 2개를 result에 합산합니다.(i
와 i의 대칭약수인 N / i
)
i의 제곱이 N보다 커질 경우 반복문을 종료하지만, i * i == N
일 경우에는 result에 1을 더 추가해야합니다 (N = 36일 경우, 6)
이때, N이 int 자료형의 Max값일 경우, i * i를 연산하는 부분에서 overflow 현상이 일어날 수 있습니다.
때문에 i의 자료형은 long타입으로 설정해야 합니다.
static int countFactors(int N) { int result = 0; long i = 1; while (i * i < N) { if(N % i == 0) result += 2; i++; } if (i * i == N) { result++; } return result; }
'Java > coding test' 카테고리의 다른 글
[HackerRank - Java] Day 1 - 2. Mini-Max Sum (0) | 2023.01.27 |
---|---|
[HackerRank - Java] Day 1 - 1. Plus Minus (0) | 2023.01.27 |
[Codility - Java] 8. Leader - 2. EquiLeader (0) | 2023.01.10 |
[Codility - Java] 4. Counting Elements - 4. MissingInteger (0) | 2023.01.09 |
[Codility - Java] 4. Counting Elements - 3. MaxCounters (0) | 2023.01.09 |