λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

[Java] BOJ 1978 μ†Œμˆ˜ μ°ΎκΈ°

by 🍊귀🍊 2024. 7. 9.

문제 

문제 링크 https://www.acmicpc.net/problem/1978

  • 첫 쀄에 수의 개수 N이 주어진닀. N은 100μ΄ν•˜μ΄λ‹€. λ‹€μŒμœΌλ‘œ N개의 μˆ˜κ°€ μ£Όμ–΄μ§€λŠ”λ° μˆ˜λŠ” 1,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.
  • 주어진 수 N개 μ€‘μ—μ„œ μ†Œμˆ˜κ°€ λͺ‡ κ°œμΈμ§€ μ°Ύμ•„μ„œ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

아이디어

  • μ†Œμˆ˜ μ°ΎκΈ°λ₯Ό 보자마자 μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체가 생각이 났닀. (사싀 크기가 μž‘μ•„μ„œ ν•˜λ‚˜ν•˜λ‚˜ 찾아도 μ‹œκ°„μ΄ˆκ³Ό μ•ˆλ‚¬μ„ 것 κ°™μ§€λ§Œ κ·Έλž˜λ„ μ’€ 더 효율적인 λ°©λ²•μœΌλ‘œ ν’€μ–΄λ³΄κ³ μž μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체둜 ν’€κΈ°λ‘œ κ²°μ‹¬ν–ˆλ‹€. γ…Žγ…Ž)

κ²ͺ은 μ‹œν–‰μ°©μ˜€

  • μ²˜μŒμ— 문제보자마자 μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•˜μ—¬ ν’€μžλΌκ³  μƒκ°ν–ˆμ§€λ§Œ 막상 μ‚¬μš©ν•˜λ €κ³  λ³΄λ‹ˆ 원리가 기얡이 μ•ˆλ‚˜μ„œ 쑰금 κ³ μƒν–ˆλ‹€... μ•žμœΌλ‘œ μ•Œκ³ λ¦¬μ¦˜μ˜ μ΄λ¦„λ§Œ κΈ°μ–΅ν•˜μ§€λ§κ³  λ°©λ²•κΉŒμ§€ μ œλŒ€λ‘œ μˆ™μ§€ν•˜λ„λ‘ 곡뢀해야겠닀..!

μ•žμœΌλ‘œ μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•˜μ—¬ ν‘ΈλŠ” λ¬Έμ œλŠ” μˆ˜μ›”ν•˜κ²Œ ν’€ 수 μžˆλ„λ‘ ν™•μ‹€ν•˜κ²Œ κ³΅λΆ€ν•˜μž!

 

μ½”λ“œ

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

// μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ‚¬μš©
// μ†Œμˆ˜λ“€μ„ λŒ€λŸ‰μœΌλ‘œ λΉ λ₯΄κ³  μ •ν™•ν•˜κ²Œ κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜

public class BOJ1978 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // λ²”μœ„κ°€ 1000μ΄λ―€λ‘œ
        boolean prime[] = new boolean[1001];

        // boolean ν•¨μˆ˜κ°€ μ²˜μŒμ— false둜 μ΄ˆκΈ°ν™” λ˜λ―€λ‘œ trueκ°€ μ†Œμˆ˜κ°€ μ•„λ‹Œ 걸둜 ν‘œμ‹œ
        // 0κ³Ό 1은 μ†Œμˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ λ°˜λŒ€λ‘œ λ°”κΏ”μ€Œ
        prime[0] = true;
        prime[1] = true;

        for(int i = 2; i <= Math.sqrt(1000); i++){
            // iκ°€ μ†Œμˆ˜μΌ 경우,
            if(!prime[i]){
                // i의 λ°°μˆ˜λŠ” μ†Œμˆ˜κ°€ μ•„λ‹ˆλ―€λ‘œ boolean 값을 λ°˜λŒ€λ‘œ λ°”κΏ”μ€Œ
                for(int j = i * i; j <= 1000; j = j + i){
                    prime[j] = true;
                }
            }
        }

        int N = Integer.parseInt(br.readLine());
        int cnt = 0;

        // μ†Œμˆ˜μΈμ§€ νŒλ³„ν•  수 μž…λ ₯λ°›κΈ°
        StringTokenizer st = new StringTokenizer(br.readLine());

        for(int i = 0; i < N; i++){
            int a = Integer.parseInt(st.nextToken());

            // false일 경우, μ†Œμˆ˜μ΄λ―€λ‘œ cnt + 1
            if(!prime[a]){
                cnt = cnt + 1;
            }
        }

        System.out.println(cnt);
    }
}