알고리즘
항해99 TIL 9일차(기사단원의 무기 / 프로그래머스)
순원이
2024. 4. 3. 17:18
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1 번째 시도
약수를 구하는 간단한 문제입니다. 그러나 개선된 약수를 구하는 식을 알아야 합니다.
16의 약수를 구하려면
1~16까지 순회하면 16%i ==0 인지 확인해야 한다.
숫자 하나의 약수를 구하는 것일 때는 상관없다. 여러 숫자를 구할 때는 시간복잡도가 O(n2)이다.
그래서 개선된 약수 구하는 방식이 있다.
1 ~ 16까지 순회하는 것이 아니라 16의 제곱근까지만 살펴보아도 된다는 것이다.
1 x 16
2 x 8
4 x 4 <- 제곱근을 기준으로 약수 요소가 같음 / 고로 제곱근까지만 탐색해도 됨
8 x 2
16 x 1
import java.util.*;
class Solution {
public int solution(int number, int limit, int power) {
int result =0;
for(int i =1; i <= number; i++) {
int knightPower = calDivisor(i);
if(knightPower > limit)
knightPower = power;
result += knightPower;
}
return result;
}
public int calDivisor(int knightNumber) {
double sqrt = Math.sqrt(knightNumber);
int divisor = 0;
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= sqrt; i++) {
if (knightNumber % i == 0) {
if (Math.pow(i, 2) == knightNumber) {
list.add(i);
} else {
list.add(i);
list.add(knightNumber / i);
}
}
}
return list.size();
}
}