[백준 자바] 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

 

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

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
  • gamzaggang7
    abcdefghklpqrstuvwxyz
    gamzaggang7
  • 전체
    오늘
    어제
    • 분류 전체보기
      • CS
        • OS
        • 자료구조_알고리즘
      • Java
      • Javascript
      • Node.js
      • React
      • Vue.js
      • 코딩테스트
        • 백준-Java
        • 프로그래머스-JS
      • Canvas
      • HTML, CSS
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.