πŸ’‘ Coding Test/Programmers

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] μ—°μŠ΅λ¬Έμ œ Lv1. μ†Œμˆ˜ μ°ΎκΈ° (Python/파이썬)

soozkim 2022. 4. 12. 23:46
[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅] μ—°μŠ΅λ¬Έμ œ - Lv1. μ†Œμˆ˜ μ°ΎκΈ°
 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μ†Œμˆ˜ μ°ΎκΈ°

1λΆ€ν„° μž…λ ₯받은 숫자 n 사이에 μžˆλŠ” μ†Œμˆ˜μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜, solution을 λ§Œλ“€μ–΄ λ³΄μ„Έμš”. μ†Œμˆ˜λŠ” 1κ³Ό 자기 μžμ‹ μœΌλ‘œλ§Œ λ‚˜λˆ„μ–΄μ§€λŠ” 수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. (1은 μ†Œμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.) μ œν•œ 쑰건 n은 2이상

programmers.co.kr

문제 μ„€λͺ…

1λΆ€ν„° μž…λ ₯받은 숫자 n 사이에 μžˆλŠ” μ†Œμˆ˜μ˜ 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜, solution을 λ§Œλ“€μ–΄ λ³΄μ„Έμš”.

μ†Œμˆ˜λŠ” 1κ³Ό 자기 μžμ‹ μœΌλ‘œλ§Œ λ‚˜λˆ„μ–΄μ§€λŠ” 수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
(1은 μ†Œμˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.)

μ œν•œμ‚¬ν•­

  • n은 2이상 1000000μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

n result
10 4
5 3

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
1λΆ€ν„° 10 μ‚¬μ΄μ˜ μ†Œμˆ˜λŠ” [2,3,5,7] 4κ°œκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 4λ₯Ό λ°˜ν™˜

μž…μΆœλ ₯ 예 #2
1λΆ€ν„° 5 μ‚¬μ΄μ˜ μ†Œμˆ˜λŠ” [2,3,5] 3κ°œκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ 3λ₯Ό λ°˜ν™˜

제좜

- 'μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체' μ‚¬μš©

- import math ν•΄μ„œ math.sqrt()λ₯Ό μ‚¬μš©ν•˜λŠ” λŒ€μ‹  ** 0.5 μ‚¬μš©

 

[Algorithm] μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 - μ†Œμˆ˜ κ΅¬ν•˜κΈ° (λ²”μœ„)

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ μ²΄λž€? κ³ λŒ€ 그리슀의 μˆ˜ν•™μž μ—λΌν† μŠ€ν…Œλ„€μŠ€κ°€ λ§Œλ“€μ–΄ λ‚Έ μ†Œμˆ˜λ₯Ό μ°ΎλŠ” 방법이며 이 방법은 마치 체둜 μΉ˜λ“―μ΄ 수λ₯Ό κ±ΈλŸ¬λ‚Έλ‹€κ³  ν•˜μ—¬ 'μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체'라고 λΆ€λ¦…λ‹ˆλ‹€. 특

coding-factory.tistory.com

def solution(n):
    # μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체 μ΄ˆκΈ°ν™”: n개 μš”μ†Œμ— True μ„€μ •(μ†Œμˆ˜λ‘œ κ°„μ£Ό)
    sieve = [True] * (n + 1)
    answer = 0

    # n의 μ΅œλŒ€ μ•½μˆ˜κ°€ sqrt(n) μ΄ν•˜μ΄λ―€λ‘œ i=sqrt(n)κΉŒμ§€ 검사
    m = int(n ** 0.5)

    for i in range(2, m + 1):
        if sieve[i] == True:           # iκ°€ μ†Œμˆ˜μΈ 경우
            for j in range(i + i, n + 1, i): # i이후 i의 λ°°μˆ˜λ“€μ„ False νŒμ •
                sieve[j] = False

    # μ†Œμˆ˜ λͺ©λ‘ μ‚°μΆœ

    return len([i for i in range(2, n + 1) if sieve[i] == True])

 

λ‹€λ₯Έμ‚¬λžŒμ˜ 풀이

- μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό λ”μš± κ°„λ‹¨ν•˜κ²Œ μž‘μ„±ν•˜μ˜€λ‹€

def solution(n):
    num=set(range(2,n+1))

    for i in range(2,n+1):
        if i in num:
            num-=set(range(2*i,n+1,i))
    return len(num)
728x90