[백준 자바] 1124번(언더프라임) - 소인수 개수가 소수인 수

2024. 6. 25. 12:30·코딩테스트/백준-Java
728x90

실버 1

문제

자연수 X를 소인수분해하면, 곱해서 X가 되는 소수의 목록을 얻을 수 있다. 예를 들어, 12 = 2 × 2 × 3이다. 1은 소수가 아니다.

어떤 수 X를 소인수분해 해서 구한 소수의 목록의 길이가 소수이면, 그 수를 언더프라임 이라고 한다. 12는 목록에 포함된 소수의 개수가 3개이고, 3은 소수이니 12는 언더프라임이다.

두 정수 A와 B가 주어졌을 때, A보다 크거나 같고, B보다 작거나 같은 정수 중에서 언더프라임인 것의 개수를 구해보자.

입력

첫째 줄에 두 정수 A와 B가 주어진다.

출력

첫째 줄에 A보다 크거나 같고, B보다 작거나 같은 언더프라임 개수를 출력한다.

제한

  • 2 ≤ A ≤ B ≤ 100,000

 

728x90

에라토스테네스의 체를 사용하여 소수를 판별하고 각 숫자의 소인수를 세어 그 개수가 소수인지 확인한다.

i = 2~n의 제곱근을 반복하여 i가 소수일 때 num을 i로 나누어 가면서 count를 증가시킨다.

반복이 끝나고 남은 num이 1보다 크면 이는 마지막 남은 소수이므로 count를 증가시킨다.

count가 소수인 경우 result를 증가시킨다.

import java.io.*;
import java.util.StringTokenizer;

public class Main1124 {
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    int A = Integer.parseInt(st.nextToken());
    int B = Integer.parseInt(st.nextToken());

    boolean[] primes = sieveOfEratosthenes(B);

    int result = 0;

    for (int n = A; n <= B; n++) {
      int count = 0;
      int num = n;
      for (int i = 2; i * i <= n; i++)
        if (!primes[i])
          while (num % i == 0) {
            count++;
            num /= i;
          }
      
      if (num > 1)
        count++;
      if (!primes[count])
        result++;
    }

    bw.write(String.valueOf(result));

    bw.flush();
    br.close();
    bw.close();
  }

  static boolean[] sieveOfEratosthenes(int max) {
    boolean[] isPrime = new boolean[max + 1];
    isPrime[0] = isPrime[1] = true;

    for (int i = 2; i * i <= max; i++)
      if (!isPrime[i])
        for (int j = i * i; j <= max; j += i)
          isPrime[j] = true;

    return isPrime;
  }
}

 

728x90

'코딩테스트 > 백준-Java' 카테고리의 다른 글

[백준 자바] 1920번(수 찾기) - Set, 이진 탐색, Arrays.binarySearch()  (0) 2024.06.27
[백준 자바] 11660번(구간 합 구하기 5) - 2차원 배열 누적 합  (0) 2024.06.26
[백준 자바] 1644번(소수의 연속합)  (0) 2024.06.24
[백준 자바] 1016번(제곱 ㄴㄴ수)  (0) 2024.06.24
[백준 자바] 6588번(골드바흐의 추측)  (0) 2024.06.23
'코딩테스트/백준-Java' 카테고리의 다른 글
  • [백준 자바] 1920번(수 찾기) - Set, 이진 탐색, Arrays.binarySearch()
  • [백준 자바] 11660번(구간 합 구하기 5) - 2차원 배열 누적 합
  • [백준 자바] 1644번(소수의 연속합)
  • [백준 자바] 1016번(제곱 ㄴㄴ수)
gamzaggang7
gamzaggang7
    250x250
  • gamzaggang7
    abcdefghklpqrstuvwxyz
    gamzaggang7
  • 전체
    오늘
    어제
    • 분류 전체보기
      • CS
        • OS
        • 자료구조_알고리즘
      • Java
      • Javascript
      • Node.js
      • React
      • Vue.js
      • 코딩테스트
        • 백준-Java
        • 프로그래머스-JS
      • Canvas
      • HTML, CSS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바
    til
    fecolormatrix
    vue.js
    npm
    백준풀이
    스택
    vue animation
    canvas
    dat.gui
    자바공부
    서버구축
    오즈코딩스쿨
    2차원배열
    React
    vue modal
    프로그래머스
    큐
    해시
    hashchange
    fegaussianblur
    자바스크립트
    Next.js
    정렬
    자바백준풀이
    css
    BFS
    Node.js
    props
    라우팅
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gamzaggang7
[백준 자바] 1124번(언더프라임) - 소인수 개수가 소수인 수
상단으로

티스토리툴바