Vibe.ai
λ°˜μ‘ν˜•

문제

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;  
            }  
        }  
    }  
}
λ°˜μ‘ν˜•
profile

Vibe.ai

@hai02y

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!