์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ/BOJ_Python

[BOJ/Step9] 1929 : ์†Œ์ˆ˜ ๊ตฌํ•˜๊ธฐ (Python)

NaNaRin๐Ÿ™ƒ 2021. 2. 14. 20:25

www.acmicpc.net/problem/1929

 

1929๋ฒˆ: ์†Œ์ˆ˜ ๊ตฌํ•˜๊ธฐ

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

www.acmicpc.net


๋ฌธ์ œ

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

 

์ž…๋ ฅ

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

 

์ถœ๋ ฅ

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

 

์˜ˆ์ œ ์ž…๋ ฅ 1

3 16

 

์˜ˆ์ œ ์ถœ๋ ฅ 1

3

5

7

11

13


ํ’€์ด 

(1) m๊ณผ n ์‚ฌ์ด ์ˆซ์ž๋ฅผ ๊ฐ๊ฐ ์†Œ์ˆ˜ ํŒ๋ณ„

  1. ์†Œ์ˆ˜๋ฉด True๋ฅผ, ์•„๋‹ˆ๋ฉด False๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ is_prime(a)

    1-1. a๊ฐ€ 1์ด๋ฉด return False

    1-2. a๋ฅผ 2~a-1์˜ ์ˆ˜๋กœ ๋‚˜๋ˆด์„ ๋•Œ ๋‚˜๋จธ์ง€๊ฐ€ 0์ด ๋˜๋ฉด return False

    1-3. a๋ฅผ 2~a-1์˜ ์ˆ˜๋กœ ๋ชจ๋‘ ๋‚˜๋ˆด๋Š”๋ฐ ํ•œ๋ฒˆ๋„ ๋‚˜๋จธ์ง€๊ฐ€ 0์ด ๋˜์ง€ ์•Š์œผ๋ฉด return True

  2. m๋ถ€ํ„ฐ n๊นŒ์ง€ a๋ฅผ ์†Œ์ˆ˜ ํŒ๋ณ„, is_prime์ด True๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ a ์ถœ๋ ฅ

# 1929-1.py

m, n = map(int, input().split())


def is_prime(a):
    if a == 1:
        return False
    for j in range(2, a):
        if a % j == 0:
            return False
    return True


for i in range(m, n+1):
    if is_prime(i):
        print(i)

 

(2) n๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์†Œ์ˆ˜ ํŒ๋ณ„ ํ›„ ํ™•์ธ
  1. prime ๋ฆฌ์ŠคํŠธ์•ˆ์— False, False, True, … ๋ฅผ ์ €์žฅํ•œ๋‹ค

      -> prime์˜ ์ธ๋ฑ์Šค ์ˆซ์ž๊ฐ€ ์†Œ์ˆ˜๋ฉด True, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด False๋ฅผ ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค

  2. ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ์ด์šฉํ•œ๋‹ค.

    2-1. i๋Š” 2๋ถ€ํ„ฐ n์˜ ์ œ๊ณฑ๊ทผ๊นŒ์ง€์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์ˆ˜๋ฅผ ์ง€์›Œ๋‚˜๊ฐˆ๊ฒƒ.

            -> i์˜ ๋ฐฐ์ˆ˜๋Š” i๋กœ ๋‚˜๋ˆ ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ prime[i]๋ฅผ False๋กœ ๋ณ€๊ฒฝ

    2-2. prime[i] ๊ฐ€ True์ผ ๋•Œ๋งŒ ๋ฐฐ์ˆ˜๋ฅผ ์ง€์šด๋‹ค -> False๋Š” ์ด๋ฏธ ๋” ์ด์ „์— ์ง€์›Œ์ง„ ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐฐ์ˆ˜ ๋˜ํ•œ ์ด๋ฏธ False

    2-3. i*i๋ถ€ํ„ฐ i์”ฉ ๋”ํ•˜๋ฉด์„œ False๋กœ ๋ณ€๊ฒฝ. i์˜ 2๋ฐฐ, 3๋ฐฐ, …, n๋ฐฐ๋Š” ๋” ์ด์ „์— ์ด๋ฏธ ์ง€์›Œ์กŒ์„๊ฒƒ์ด๋ฏ€๋กœ i*i๋ถ€ํ„ฐ ์ง€์›Œ๋‚˜๊ฐ„๋‹ค

  3. ์ž…๋ ฅ๋ฐ›์€ m๋ถ€ํ„ฐ n๊นŒ์ง€ prime[m] ~prime[n]์˜ ๊ฐ’์„ ํ™•์ธํ•˜์—ฌ True์ผ ๋•Œ๋งŒ ์ถœ๋ ฅํ•œ๋‹ค

# 1929-2.py

m, n = map(int, input().split())
prime = [False, False] + [True] * (n - 1)
for i in range(2, int(pow(n, 0.5)+1)):
    if prime[i]:
        for j in range(i*i, n+1, i):
            prime[j] = False

for i in range(m, n+1):
    if prime[i]:
        print(i)

 

์œ„๊ฐ€ (1)๋ฒˆ ์•„๋ž˜๊ฐ€ (2)๋ฒˆ

(1)๋ฒˆ์€ ์†๋„๋Š” ๋Š๋ฆฌ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ์ ๊ณ 

(2)๋ฒˆ์€ ์†๋„๋Š” ๋น ๋ฅด์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ํฌ๋‹ค

์ฐจ์ด๊ฐ€ ์—„์ฒญ๋‚จ... ์™œ๊ทธ๋Ÿฐ๊ฑธ๊นŒ