문제
문제 풀이
해당 문제는 1 ~ 100000까지 값이 제공이 되기 때문에 O^2 을 사용하면 통과가 안되는 문제이다.
그렇기 때문에 어떻게 계산을 줄여야 하는가에 고민을 해야한다.
약수를 구하는 for문에서 기준 num /2 까지 수를 나누어 나머지를 구하는 방법을 하면 그나마 복잡도를 줄여 줄 수 있어 해당 방식으로 접근하였다.
나의 답안
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= number; i++) {
int count =1;
for (int j = 1; j <= i /2 ; j++) {
if (i % j == 0) count++;
}
if (count > limit) list.add(power);
else list.add(count);
}
return list.stream().reduce(0, (integer, integer2) -> integer + integer2);
다른 답안
아래의 방식은 num의 배수마다 매번 카운팅하여 약수를 구하는 방식이다. 속도가 엄청 빨라서 다음에 이런 비슷한 문제는 이러한 방식으로 접근을 해보도록 해야겠음.
int[] count = new int[number + 1];
for (int i = 1; i <= number; i++) {
for (int j = 1; j <= number / i; j++) {
count[i * j]++;
}
}
int answer = 0;
for (int i = 1; i <= number; i++) {
if (count[i] > limit) {
answer += power;
} else {
answer += count[i];
}
}
return answer;
'Programmers 문제풀이 > Lv.1' 카테고리의 다른 글
덧칠하기 (0) | 2023.03.23 |
---|---|
체육복 (0) | 2023.03.23 |
로또의 최고 순위와 최저 순위 (0) | 2023.03.22 |
[1차] 다트 게임 (0) | 2023.03.22 |
명예의 전당 (1) (0) | 2023.03.22 |