μ†Œμˆ˜(μ—λΌν† μŠ€ν…Œλ„€μŠ€ 체)

πŸ“„ 문제

μžμ—°μˆ˜ N이 μž…λ ₯되면 1λΆ€ν„° NκΉŒμ§€μ˜ μ†Œμˆ˜μ˜ 개수λ₯ΌμΆœλ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.
λ§Œμ•½ 20이 μž…λ ₯되면 1λΆ€ν„° 20κΉŒμ§€μ˜ μ†Œμˆ˜λŠ” 2, 3, 5, 7, 11, 13, 17, 19둜 총 8κ°œμž…λ‹ˆλ‹€.
μ œν•œμ‹œκ°„μ€ 1μ΄ˆμž…λ‹ˆλ‹€.

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

β–£ 좜λ ₯μ„€λͺ…
첫 쀄에 μ†Œμˆ˜μ˜ 개수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

β–£ μž…λ ₯예제
20

β–£ 좜λ ₯예제
8

🧞 풀이

더보기

풀이 (μ‹œκ°„ 초과)

# μž…λ ₯: 첫 쀄 - μžμ—°μˆ˜μ˜ 개수 n
# 좜λ ₯: μ†Œμˆ˜μ˜ 개수 좜λ ₯

from math import sqrt               # math νŒ¨ν‚€μ§€μ—μ„œ 제곱근 κ΅¬ν•˜λŠ” sqrt λͺ¨λ“ˆ 뢈러였기

n = int(input())                    # μ •μˆ˜ n μž…λ ₯ 및 ν• λ‹Ή

cnt = [0] * (n+1)                   # n+1개 만큼의 0을 λ‹΄λŠ” 리슀트 cnt ν• λ‹Ή

for i in range(2, int(sqrt(n))+1):  # 2λΆ€ν„° n의 제곱근 + 1κΉŒμ§€ 반볡
    for j in range(2, n+1):         # 2λΆ€ν„° nκΉŒμ§€ 반볡
        if i != j and j % i == 0:   # i와 jκ°€ μ„œλ‘œ λ‹€λ₯΄λ©΄μ„œ, iλ₯Ό j둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ 0일 λ•Œ,
            cnt[j] = 1              # cnt[j]의 값을 1둜 λ³€κ²½
print(cnt.count(0)-2)               # cnt의 0의 갯수 - 2λ₯Ό 좜λ ₯ (cnt[0]κ³Ό cnt[1]은 0κ³Ό 1이기 λ•Œλ¬Έμ— λΉΌμ€˜μ•Ό 함)

 

λ‹€λ₯Έ μ‚¬λžŒ ν’€μ΄

# μ†Œμˆ˜(μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체)

n = int(input())                        # μ •μˆ˜ n μž…λ ₯ 및 ν• λ‹Ή
ch = [0] * (n+1)                        # n+1개 만큼의 0을 λ‹΄λŠ” 리슀트 ch ν• λ‹Ή
cnt = 0                                 # 갯수 μ„ΈκΈ° μœ„ν•œ cnt ν• λ‹Ή

for i in range(2, n+1):                 # 2λΆ€ν„° nκΉŒμ§€ 반볡
    if ch[i] == 0:                      # ch[i] κ°€ 0일 λ•Œ,
        cnt += 1                        # cnt 1 더해주기
        for j in range(i, n+1, i):      # iλΆ€ν„° nκΉŒμ§€ i의 κ°„κ²©μœΌλ‘œ (λ°°μˆ˜λ“€μ„ 확인할 수 있음)
            ch[j] = 1                   # λ°°μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” j일 경우, 1둜 ch[j] κ°’ λ³€ν™˜

print(cnt)                              # cnt κ°’ 좜λ ₯

+ Recent posts