Algorithm๐Ÿฅ‡

1929.์†Œ์ˆ˜๊ตฌํ•˜๊ธฐ

hae02y 2023. 10. 19. 15:56
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

M์ด์ƒ N์ดํ•˜์˜ ์†Œ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ž์—ฐ์ˆ˜ M๊ณผ N์ด ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค M โ‰ค N โ‰ค 1,000,000) M์ด์ƒ N์ดํ•˜์˜ ์†Œ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ, ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์†Œ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งžํžŒ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 256 MB 255621 74495 52354 27.211%

https://www.acmicpc.net/problem/1929

ํ’€์ด

์•Œ๊ณ ๋ฆฌ์ฆ˜

์ด ๋ฌธ์ œ๋Š” ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ์— ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค. ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๊ฐ€ ๊ฐ€์žฅ ๋Œ€์ค‘์ ์ด๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจ์ด ๋งค์šฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ผ๋‹จ ์†Œ์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์ž.

์†Œ์ˆ˜ (Prime Number)
์†Œ์ˆ˜์˜ ์ •์˜๋Š” 1๋ณด๋‹ค ํฐ ์ž์—ฐ์ˆ˜ ์ค‘ 1 ๊ณผ ๊ทธ ์ˆ˜ ์ž๊ธฐ ์ž์‹ ๋งŒ์„ ์•ฝ์ˆ˜๋กœ ๊ฐ–๋Š” ์ž์—ฐ์ˆ˜๋ฅผ ์˜๋ฏธ

๊ทธ๋Ÿผ ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.

" k=2 ๋ถ€ํ„ฐ โˆšN ์ดํ•˜๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์ž์—ฐ์ˆ˜๋“ค ์ค‘ k๋ฅผ ์ œ์™ธํ•œ k์˜ ๋ฐฐ์ˆ˜๋“ค์„ ์ œ์™ธ์‹œํ‚จ๋‹ค"

์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • k = 2 ์ด๋ฉด 2 ๋ฅผ ์ œ์™ธํ•œ 2์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์›Œ์ค€๋‹ค.
  • k = 3 ์ด๋ฉด 3 ์„ ์ œ์™ธํ•œ 3์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์›Œ์ค€๋‹ค.
  • (4๋Š” ์ด๋ฏธ k = 2 ์—์„œ ์ œ์™ธ๋˜์–ด ๋„˜์–ด๊ฐ„๋‹ค.)
  • k = 5 ์ด๋ฉด 5 ๋ฅผ ์ œ์™ธํ•œ 5์˜ ๋ฐฐ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ง€์›Œ์ค€๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ k = โˆšN ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์—ฌ๊ธฐ์„œ โˆšN ์ดํ•˜๊นŒ์ง€๋งŒ ๋ฐ˜๋ณตํ•˜๋ฉด ๋˜๋Š” ์ด์œ ๋Š” ๋ญ˜๊นŒ?

์†Œ์ˆ˜๋ฅผ ํŒ๋ณ„ํ•œ ๋‹ค๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ์— 1๊ณผ ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์ž์—ฐ์ˆ˜๋ฅผ ์•ฝ์ˆ˜๋กœ ๊ฐ€์ง€๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ž„์˜์˜ ์ž์—ฐ์ˆ˜ ๐ (๐ > 0) ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

๐‘ ร— ๐‘ž = ๐ ์„ ๋งŒ์กฑํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ถ€๋“ฑ์‹์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

( 1 โ‰ค ๐‘ , ๐‘ž โ‰ค ๐ )

๊ทธ๋ฆฌ๊ณ  ๐‘ ์™€ ๐‘ž ์ค‘ ํ•˜๋‚˜๋Š” โˆšN ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์˜ˆ๋กœ๋“ค์–ด ๐ = 12 ๋ผ๊ณ  ํ•˜์ž.

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ์ˆ˜์˜ ๊ณฑ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

1 ร— 12

2 ร— 6

3 ร— 4

4 ร— 3

6 ร— 2

12 ร— 1

์—ฌ๊ธฐ์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋งŒ์•ฝ ๐‘ ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค๋ฉด ์ž์—ฐ์Šค๋ ˆ ๐‘ž ๊ฐ€ ๊ฐ์†Œํ•˜๊ณ ,

๋ฐ˜๋Œ€๋กœ ๐‘ ๊ฐ€ ๊ฐ์†Œํ•œ๋‹ค๋ฉด ์ž์—ฐ์Šค๋ ˆ ๐‘ž ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๐‘ ์™€ ๐‘ž ๋Š” ๐์˜ ์•ฝ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๐ ์„ ์ž„์˜์˜ ์ˆ˜๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋˜๋ฉด ์ž„์˜์˜ ์ˆ˜๊ฐ€ โˆšN ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๊ฒฐ๊ตญ ๋‚˜๋จธ์ง€๋Š” โˆšN ๋ณด๋‹ค ํด ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๐‘ ์™€ ๐‘ž ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ˜๋“œ์‹œ โˆšN ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์ฆ‰, โˆšN ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜ ์ค‘์— ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋Š” 1 ๊ณผ N ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์ž์—ฐ์ˆ˜๊ฐ€ N ์˜ ์•ฝ์ˆ˜๋ผ๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ st-lab ๋ธ”๋กœ๊ทธ

์ฝ”๋“œ

์ฒซ๋ฒˆ์งธ์‹œ๋„

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.StringTokenizer;  

public class ์†Œ์ˆ˜๊ตฌํ•˜๊ธฐ {  

    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");  

        int m = Integer.parseInt(st.nextToken());  
        int n = Integer.parseInt(st.nextToken());  

        for(int i=m; i<=n; i++){  
            for(int j=2; j<=i; j++){  
                if(j == i) { //์ž๊ธฐ์ž์‹ ๊นŒ์ง€์™€์„œ ๋‚˜๋ˆ ์ง€๋ฉด ์ถœ๋ ฅํ•˜๊ณ  ๋‹ค์Œ์ˆซ์ž๋กœ  
                    System.out.println(j);  
                    break;  
                }  
                else if (i % j != 0) { //๋‚˜๋ˆ ์„œ 0์ด ์•„๋‹ˆ๋ฉด ๊ณ„์†์ง„ํ–‰  
                    continue;  
                }else break; //์ž๊ธฐ์ž์‹ ์ด์™ธ์˜ ๊ฒƒ์œผ๋กœ ๋‚˜๋ˆ ์ง€๋ฉด ์ถœ๋ ฅํ•˜์ง€์•Š๊ณ  ์ข…๋ฃŒํ•จ  
            }  

        }  

        br.close();  
    }  
}

์ด๋ฐฉ๋ฒ•์œผ๋กœ ๋Š” ์‹คํŒจํ•˜์˜€๋‹ค.. ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œจ๋Š”๋ฐ for๋ฌธ์„ 2๋ฒˆ ์‚ฌ์šฉํ•œ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค.

2๋ฒˆ์งธ ์‹œ๋„

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.StringTokenizer;  

public class ์†Œ์ˆ˜๊ตฌํ•˜๊ธฐ {  


    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");  
        StringBuilder sb = new StringBuilder();  

        int m = Integer.parseInt(st.nextToken());  
        int n = Integer.parseInt(st.nextToken());  

        //์†Œ์ˆ˜์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋‹จํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. ๋ฐฐ์—ด์ƒ์„ฑ์‹œ ๋””ํดํŠธ๋Š” false๋‹ค.  
        boolean[] prime = new boolean[n + 1];  

        for (int i = 2; i <= n; i++) {  
            if (prime[i]) continue; //์†Œ์ˆ˜๋ฐฐ์—ด์ด ์ฐธ์ผ๋•Œ ๋„˜์–ด๊ฐ„๋‹ค.  

            if (i >= m) sb.append(i).append("\n"); //i๊ฐ€ m๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด i๋ฅผ ์ถœ๋ ฅ๊ฐ’์— ๋„ฃ์–ด์ค€๋‹ค.  

            //true : ์†Œ์ˆ˜์•„๋‹˜ , false : ์†Œ์ˆ˜
            for (int j = i + i; j <= n; j += i) {  
                prime[j] = true; //์กฐ๊ฑด์— ๋งž์œผ๋ฉด true๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.
            }  
        }  
        System.out.println(sb);  
        br.close();  
    }  
}

์„ฑ๊ณต!
๋‹ต์ง€๋ฅผ ๋ณด๊ณ ๋ฌธ์ œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ for๋ฌธ์ด ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ์ดํ•ดํ• ์ˆ˜๊ฐ€ ์—†์–ด์„œ ์ข€๋” ์ฐพ์•„๋ด์•ผ๋ ๊ฒƒ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ๊ฐํ•ด๋‚ธ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

3๋ฒˆ์งธ ์‹œ๋„

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.StringTokenizer;  

public class ์†Œ์ˆ˜๊ตฌํ•˜๊ธฐ {  

    public static boolean[] prime;  

    public static void main(String[] args) throws IOException {  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");  
        StringBuilder sb = new StringBuilder();  

        int m = Integer.parseInt(st.nextToken());  
        int n = Integer.parseInt(st.nextToken());  

        //์†Œ์ˆ˜์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋‹จํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. ๋ฐฐ์—ด์ƒ์„ฑ์‹œ ๋””ํดํŠธ๋Š” false๋‹ค.  
        prime = new boolean[n + 1];  

        getPrime();  

        for (int i=m; i<=n; i++){  
            if(!prime[i]) System.out.println(i);  
        }  

        br.close();  
    }  

    private static void getPrime() {  
        //true : ์†Œ์ˆ˜ ์•„๋‹˜, false : ์†Œ์ˆ˜  
        prime[0] = prime[1] = true;  

        for (int i=2; i<= Math.sqrt(prime.length); i++){  
            if(prime[i]) continue;  
            for(int j= i*i; j<prime.length; j+=i){  
                prime[j] = true;  
            }  
        }  
    }  
}
๋ฐ˜์‘ํ˜•