코테/백준

[백준/JAVA] 1456번: 거의 소수

imname1am 2023. 4. 25. 16:24
반응형

🔺 문제

 

1456번: 거의 소수

어떤 수가 소수의 N제곱(N ≥ 2) 꼴일 때, 그 수를 거의 소수라고 한다. 두 정수 A와 B가 주어지면, A보다 크거나 같고, B보다 작거나 같은 거의 소수가 몇 개인지 출력한다.

www.acmicpc.net

 

 

🔺 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.*;
import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        
        long Min = Long.parseLong(st.nextToken());
        long Max = Long.parseLong(st.nextToken());
        long[] A = new long[10000001];
 
        // 배열 초기화
        for(int i = 2 ; i < A.length ; i++) {
            A[i] = i;
        }
 
        
        for(int i = 2 ; i <= Math.sqrt(A.length) ; i++) {    // 제곱근까지만 수행
            if(A[i] == 0continue;    // 소수가 아니면 넘어감
            
            for(int j = i + i ; j < A.length ; j += i) {    // 배수 지우기
                A[j] = 0;
            }
        }
        
        
        int cnt = 0;
        for(int i = 2 ; i < A.length ; i++) {
            if(A[i] != 0) {
                long tmp = A[i];    // 현재 소수
                
                // 🔔 소수를 N제곱한 값이 B보다 커질 때까지 반복문 실행
                while((double)A[i] <= (double)Max / (double)tmp) {
                    if((double)A[i] >= (double)Min / (double)tmp) {    // 🔔 소수를 N제곱한 값이 M보다 크거나 같으면 => 거의 소수
                        cnt++;
                    }
                    
                    tmp *= A[i];
                }
            }
        }
        System.out.println(cnt);
    }
}
 
cs
✅ 해결 아이디어
✔ 에라토스테네스의 체

 

💥 유의사항

⇨ (반복문 범위) 10의 14제곱의 제곱근인 10의 7제곱까지 반복

N제곱한 값을 구하다가 범위가 long형을 초과하는 경우가 발생하므로 이항 정리로 처리

    -  (N의 k 제곱) vs B가 아닌, N vs B / (N의 k-1 제곱)으로 비교 (37,38번째 줄)

 


🔺 다른 풀이들

 

[백준] 1456 : 거의 소수 - JAVA

🙋🏻‍♀️에라토스테네스의 체 이용!A이상 B이하의 거의 소수 개수를 출력하는 문제다.에라토스테네스의 체를 이용해 B의 제곱근까지 소수를 구하고, 제곱했을 떄 A이상 B이하인 수의 개수를

velog.io

 

[JAVA 순환 알고리즘] 백준 알고리즘 1456번 / 거의소수 찾기

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576package baekjoon; import java.util.Scanner;import java.util.Vector;/** * * 백준 알고리즘 거의소수 찾

titanyang.tistory.com

 

 

https://www.acmicpc.net/source/29360286

 

로그인

 

www.acmicpc.net


💬 느낀 점

37,38번째 줄 처럼 조건을 잘 생각하고 적용시켜야겠다..

 

1회독 2회독 3회독 4회독 5회독
V 6/20      

 

반응형