[백준 Java] 2247번 실질적 약수(정수론)

2024. 1. 8. 05:13·Algorithm/PS - 백준
728x90
반응형

💡문제

[Gold V] 실질적 약수 - 2247

문제 링크

성능 요약

메모리: 11588 KB, 시간: 732 ms


깨진 부분은 여기에서 확인

🤔접근법

범위 체크 및 시간복잡도 예상

  • 1 ≤ n ≤ 200,000,000 .. 2억
  • 시간 제한이 2초라 $O(N)$ 도 가능할 거 같다.

풀이법

❌ 첫번째 접근 방법 . 에라토스테네스의 체

  1. 소수 판별 (에라토스테네스의 체) $O(log(logN))$
  2. 소수가 아닌 N에 대해 순회 $O(N)$ → (여기가 이미 188,921,062)
  3. 실질적 약수 구하기 SCD(N) $O(\sqrt N)$

➡️ 해당 풀이법의 시간 복잡도 : $O(N\sqrt N)$이다


⭕ 두번째 접근 방법 . N까지 x의 배수의 개수

  1. 1 ~ N까지 순회 $O(N)$
  2. N 이하의 수에서 어떤 수 i를 약수로 가지는 수의 개수 $O(1)$
    • N / i

그럼 2번 과정에 대해서 자세히 알아보자

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2를 약수로 가지는 수 제외 O O O O O O O O O
3를 약수로 가지는 수 제외 O O O O O
4를 약수로 가지는 수 제외 O O O O
5를 약수로 가지는 수 제외 O O O
- 2를 약수로 가지는 수의 개수는 ( 20 / 2 ) = 10 -1 이때, 자기자신을 약수로 가지고 있는애는 실질적인 약수가 아니기 때문에 제외한다. ( -1의 이유)
- 3를 약수로 가지는 수의 개수는 20 / 3 = 6 -1
- 4을 약수로 가지는 수의 개수는 20 / 4= 5 -1
- 5을 약수로 가지는 수의 개수 20 / 5 = 4 -1

이때 유의 사항은 1과 N을 포함하지 않고 반복해야한다.

이 과정을 2 ~ 19 까지 모두 진행하게 되면

i * i를 약수로 가지는 수의 개수 들의 합이

(2 * 9) + (3 * 5) +( 4 * 4) + (5 * 4) + … = SCDN(20) 이 된다.

➡️ 해당 풀이법의 시간 복잡도 : $O(N)$이다


🤯FAIL

첫 번째 접근 ▶️ 시간 초과 - 잘못 계산한 이유

2번 순회 하는 과정을 빼먹었다. (위에 작성한 것은 수정하여서 옳은 시간복잡도)

1 ~ N까지 순회하면서 N의 약수를 구하는 로직인데 소수이면 넘어가고 소수가 아닌 경우에만 약수를 구한다.

나는 여기서 소수인 경우만 로직을 수행하니까 순회하는 시간복잡도인 O(N)을 무시해도 되겠다 생각했는데

실제로 계산해보니 200,000,000 까지 소수가 아닌 수는 188,921,062개나 있었다.

그러면 10,000 * 100,000,000 만 해도 이미 .. 시간 초과이다 .

😎SUCCESS

두 번째 접근 ▶️ 성공


👩‍💻 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main_2247 {
    static int n;

    static long sum;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());

        sum = 0;
        for (int i = 2; i < n; i++) {
            sum += ((n/i)-1) * i;
        }

        System.out.println(sum%1000000);


    }
}
반응형

'Algorithm > PS - 백준' 카테고리의 다른 글

[백준 Java] 2015번 수들의 합 4  (0) 2024.01.12
[백준 Java] 2004번 조합 0의 개수(정수론)  (0) 2024.01.09
[백준 Java] 23888번 등차수열과 쿼리 (정수론)  (1) 2024.01.08
[백준 Java] 6219번 소수의 자격 (정수론)  (1) 2024.01.07
[백준 Java] 1407번 2로 몇 번 나누어질까(정수론)  (1) 2024.01.04
'Algorithm/PS - 백준' 카테고리의 다른 글
  • [백준 Java] 2015번 수들의 합 4
  • [백준 Java] 2004번 조합 0의 개수(정수론)
  • [백준 Java] 23888번 등차수열과 쿼리 (정수론)
  • [백준 Java] 6219번 소수의 자격 (정수론)
제가안난데여♪(´ε`*)
제가안난데여♪(´ε`*)
기억의 유한함을 기록의 무한함으로 ✍️ 예비 개발자가 꿈꾸는 공간 여기는 안나의 개발 블로그 💻
  • 제가안난데여♪(´ε`*)
    안나의 전두엽 어딘가 🧠
    제가안난데여♪(´ε`*)
    기억의 유한함을 기록의 무한함으로 ✍️ 예비 개발자가 꿈꾸는 공간 여기는 안나의 개발 블로그 💻
  • 전체
    오늘
    어제
    • 분류 전체보기 (128)
      • 간단하게 한스푼🥄 (1)
      • Programming (56)
        • Spring (16)
        • Vue.js (6)
        • Deep Learning (3)
        • DataBase (5)
        • React (26)
      • DevOps (21)
        • Docker (12)
        • Linux (4)
      • Algorithm (46)
        • 알고리즘 정리 (5)
        • 자료구조 (0)
        • PS - 백준 (28)
        • 99클럽 코테 스터디 (13)
      • Project (0)
        • CampFire (0)
      • 안나의 취뽀일기 (˵ •̀ ᴗ - ˵ ) ✧ (4)
        • SSAFY_9기 (2)
        • SW 부트캠프 (2)
  • 잔디 달력

    «   2025/07   »
    일 월 화 수 목 금 토
    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
  • 인기 글

  • 태그

    React
    도커컨테이너
    Vue.js 입문하기
    greedy
    도커
    자바 스택
    front-end
    김영한
    Vue.js
    java stack
    java
    코딩테스트 준비
    항해99
    99클럽
    개발자 취업
    백준
    linux
    java 백준
    topology sort
    백준 java
    리액트 상태
    자바
    Vue
    알고리즘
    Spring
    til
    docker
    백준 구현문제
    stack
    springboot
  • 07-11 07:58
    반응형
  • hELLO· Designed By정상우.v4.10.3
제가안난데여♪(´ε`*)
[백준 Java] 2247번 실질적 약수(정수론)
상단으로

티스토리툴바