λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

[λ°°μ—΄] 5. μ†Œμˆ˜(μ—λΌν† μŠ€ν…Œλ„€μŠ€ 체)

μ‹œνλ¦¬ν‹°μ§€ν˜Έ 2023. 12. 14.
5. μ†Œμˆ˜(μ—λΌν† μŠ€ν…Œλ„€μŠ€ 체)
 

μ„€λͺ…

μžμ—°μˆ˜ N이 μž…λ ₯되면 1λΆ€ν„° NκΉŒμ§€μ˜ μ†Œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

λ§Œμ•½ 20이 μž…λ ₯되면 1λΆ€ν„° 20κΉŒμ§€μ˜ μ†Œμˆ˜λŠ” 2, 3, 5, 7, 11, 13, 17, 19둜 총 8κ°œμž…λ‹ˆλ‹€.

μž…λ ₯

첫 쀄에 μžμ—°μˆ˜μ˜ 개수 N(2<=N<=200,000)이 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

좜λ ₯

첫 쀄에 μ†Œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μ˜ˆμ‹œ μž…λ ₯ 1 

20

μ˜ˆμ‹œ 좜λ ₯ 1

8

 

 

<<풀이>>

 

이 λ¬Έμ œλŠ” 사싀 λ…Έκ°€λ‹€ν•˜λ©΄ λ°”λ‘œ ν’€ μˆ˜λŠ” μžˆμ§€λ§Œ μ‹œκ°„ λ³΅μž‘λ„κ°€ N^2으둜 μ—„μ²­ 컀지고 λŠλ €μ§€λŠ” κ²½ν–₯이 μžˆλ‹€. 즉, μ½”λ”©ν…ŒμŠ€νŠΈ μ±„μ μ‹œ μ‹œκ°„μ΄ˆκ³Όλ‘œ μ μˆ˜κ°€ κΉŽμΈλ‹€. 

 

κ·Έλž˜μ„œ 이 λ¬Έμ œλŠ” μ—λΌν† μŠ€ν…Œλ„€μŠ€ 체 λΌλŠ” 방식을 μ΄μš©ν•œλ‹€.

 

즉 20κΉŒμ§€μ˜ μˆ˜κ°€ μžˆλ‹€λ©΄ 1을 μ œμ™Έν•˜κ³  2λΆ€ν„°ν•΄μ„œ 자기 μžμ‹ μ„ μ œμ™Έν•˜κ³  λ‚˜λˆ„μ–΄ 제거 μ‹œμΌœλ‚˜κ°€λ©΄μ„œ μ΅œμ’…μ μœΌλ‘œ 제거 λ˜μ§€ μ•Šμ€ κ°―μˆ˜κ°€ μ†Œμˆ˜ μž„μ„ μ΄μš©ν•˜λŠ” 것이닀.

 

이λ₯Ό μ½”λ“œλ‘œ 닀루면

 

import java.util.Scanner;

class Main {
    public int soltuion(int n) {
        int answer = 0;
        int[] ch = new int[n + 1];
        for (int i = 2; i <= n; i++) {
            if (ch[i] == 0) {
                answer++;
                for (int j = i; j <= n; j = j + i) ch[j] = 1;

            }
        }
        return answer;
    }


        public static void main (String[]args){
            Main T = new Main();
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            System.out.println(T.soltuion(n));
        }

}

 

 

2 λΆ€ν„° μ‹œμž‘ν•΄μ„œ 2의 λ°°μˆ˜λŠ” 1둜 λ°”κΎΈκ³  3의 λ°°μˆ˜λ„ 1둜 λ°”κΎΌλ‹€. μ΄λ•Œ 4의 λ°°μˆ˜λŠ” 2의 λ°°μˆ˜κ°€ 이미 1둜 λ§Œλ“€μ–΄ 놨기 λ•Œλ¬Έμ— ν•„μš”κ°€ μ—†λ‹€.

κ·ΈλŸ¬λ©΄μ„œ, 0이 λ‚˜μ˜¬ λ•Œ answer 값을 μ¦κ°€μ‹œν‚¨λ‹€.

 

이 문제의 흐름을 잘 νŒŒμ•…ν•˜μž.

λŒ“κΈ€