Post

🧩 Baekjoon 2581 - μ†Œμˆ˜

🧩 Baekjoon 2581 - μ†Œμˆ˜

문제

μžμ—°μˆ˜ Mκ³Ό N이 μ£Όμ–΄μ§ˆ λ•Œ M이상 Nμ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 μ†Œμˆ˜μΈ 것을 λͺ¨λ‘ 골라 이듀 μ†Œμˆ˜μ˜ ν•©κ³Ό μ΅œμ†Ÿκ°’μ„ μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 예λ₯Ό λ“€μ–΄ M=60, N=100인 경우 60이상 100μ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 μ†Œμˆ˜λŠ” 61, 67, 71, 73, 79, 83, 89, 97 총 8κ°œκ°€ μžˆμœΌλ―€λ‘œ, 이듀 μ†Œμˆ˜μ˜ 합은 620이고, μ΅œμ†Ÿκ°’μ€ 61이 λœλ‹€.

μž…λ ₯

μž…λ ₯의 첫째 쀄에 M이, λ‘˜μ§Έ 쀄에 N이 μ£Όμ–΄μ§„λ‹€. Mκ³Ό N은 10,000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ©°, M은 N보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

좜λ ₯

M이상 Nμ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 μ†Œμˆ˜μΈ 것을 λͺ¨λ‘ μ°Ύμ•„ 첫째 쀄에 κ·Έ 합을, λ‘˜μ§Έ 쀄에 κ·Έ 쀑 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.Β  단, M이상 Nμ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 μ†Œμˆ˜κ°€ 없을 κ²½μš°λŠ” 첫째 쀄에 -1을 좜λ ₯ν•œλ‹€.

예제

βœ… μž…λ ₯ 1

1
2
60
100

βœ… 좜λ ₯ 1

1
2
620
61

βœ… μž…λ ₯ 2

1
2
64
65

βœ… 좜λ ₯ 2

1
-1

μž‘μ„± μ½”λ“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    static int[] primeArr;
    
    public static void main(String[] args) throws IOException {
        // 1. λ³€μˆ˜ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int m = Integer.parseInt(br.readLine());
        int n = Integer.parseInt(br.readLine());
        int result = 0;
        int minValue = 0;
        
        // 2. 처리
        makePrimeArr(n);
        
        for (int i = m; i <= n; i++) {
            if (primeArr[i] == 1) {
                result += i;
                if (minValue == 0) minValue = i;
            }
        }
        
        // 3. 좜λ ₯
        if (result == 0) {
            System.out.println(-1);
        } else {
            System.out.println(result);
            System.out.println(minValue);
        }
    }
    
    static void makePrimeArr(int num) {
        // λ°°μ—΄ μ΄ˆκΈ°ν™”
        primeArr = new int[num + 1];
        Arrays.fill(primeArr, 1);
        primeArr[0] = primeArr[1] = 0;
        
        // μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체
        for (int i = 2; i <= num; i++) {
            if (primeArr[i] == 0) continue;
            for (int j = i * 2; j <= num; j += i) primeArr[j] = 0;
        }
    }
}

회고

  • 항상 문제λ₯Ό ν’€ λ•Œ ꡬ체적인 생각 없이 머리둜만 μ˜ˆμƒλ˜λŠ” 방법을 그리곀 ν–ˆλŠ”λ° κ°€λŠ₯ν•œ 문제λ₯Ό μž‘κ²Œ μͺΌκ°œλ €κ³  ν•΄λ³΄μ•˜μœΌλ©°, λ‹€λ₯Έ 문제λ₯Ό ν’€ λ•Œμ—λ„ 이런 λ°©μ‹μœΌλ‘œ μ ‘κ·Όν•΄λ³΄κ³ μž ν•œλ‹€.
  • M이상 Nμ΄ν•˜μ˜ μžμ—°μˆ˜λ₯Ό μˆœνšŒν•˜μ—¬ μ†Œμˆ˜μ˜ ν•©κ³Ό μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜λŠ” 메인 둜직과 μ†Œμˆ˜λ₯Ό νŒλ³„ν•˜λŠ” μ„œλΈŒ 둜직 2개둜 λ‚˜λˆ„μ—ˆλ‹€.
  • μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό 톡해 λ°°μ—΄ ꡬ성은 ν•œ 번만 ν•˜κ³  μ΄ν›„μ—λŠ” ν™œμš©λ§Œ ν•˜λ©΄ λœλ‹€λŠ” 점을 μ΄ν•΄ν–ˆλ‹€.
This post is licensed under CC BY 4.0 by the author.