일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 쓰레드
- 프로그래머스
- 백준
- Direct12
- DirectX12
- 동적계획법
- 다이나믹프로그래밍
- 타입 객체
- 알고리즘
- I/O장치
- 다이나믹 프로그래밍
- 그리디알고리즘
- 병행성
- directx
- 그리디 알고리즘
- OS
- 멀티쓰레드
- 렌더링 파이프라인
- DirectX 12
- 영속성
- 파일시스템 구현
- codility
- 병행성 관련 오류
- 멀티프로세서
- 운영체제
- 자료구조
- 디자인패턴
- 스케줄링
- 컨디션 변수
- 락
Archives
- Today
- Total
기록공간
CountFactors (Codility) 본문
반응형
문제
정수 N이 주어진다. 이 N의 약수들의 갯수를 출력하라.
N = 24인 경우 24의 약수는 1, 2, 3, 4, 6, 7, 12, 24 이므로 총 8개 이므로, 답은 8이다.
해결 방법
1부터 N까지 나눠지는 값은 약수이다. 이 방법으로 카운트를 세서 출력하면 정답이다.
하지만 이 방법은 시간 복잡도 O(N)으로 만약 N이 int의 최대값(약 21억)으로 주어진다면 시간초과가 난다.
여기서 약수의 갯수를 간단하게 구하는 중요한 사실이 있다. "만약 √(N)이 정수라면 √(N)은 N의 약수이며, 나머지 약수들은 √(N)를 기준으로 앞 뒤로 짝을 이루고 있다."는 것이다.
예를 들어 100의 약수의 갯수를 구한다고 해보자.
100의 약수는 1, 2, 4, 5, 10, 20, 25, 50, 100이다.
√(100)은 10으로 정수이다.
즉 100의 약수는 10을 기준으로 앞 뒤로 짝을 이루고 있다는 것이다.
(1, 100), (2, 50), (4, 25), (5, 20)으로 4개의 짝을 이루고 있으므로
2 * 4 + 1 = 9개가 된다.
√(N)을 넘어가지 않는 조건으로 (i = 1)부터 for문을 돌려 만약 N이 i로 나눠진다면 1개, 그리고 이 약수는 앞뒤로 짝을 이룰 것이므로, i^2이 N을 넘지 않는다면 1개 증가시키면 된다.
주의할 점이 있는데 N의 범위는 int 범위로 [1 ~ 약 21억]까지이므로 i^2를 구하기 위해서는 더 큰 범위를 가지는 long long 자료형을 사용해야 한다.
구현 코드는 다음과 같다.
int solution(int N) {
int count = 0;
for(long long i = 1; i * i <= N ; ++i) {
if(N % i == 0) {
++count;
if(i * i < N)
++count;
}
}
return count;
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
오픈채팅방 (프로그래머스) (0) | 2020.08.19 |
---|---|
MinPerimeterRectangle (Codility) - Java (0) | 2020.08.18 |
MaxSliceSum (Codility) (0) | 2020.08.07 |
MaxProfit (Codility) - Java (0) | 2020.08.01 |
MaxDoubleSliceSum (Codility) - Java (2) | 2020.07.31 |
Comments