PS

[λ°±μ€€] 1124 μ–Έλ”ν”„λΌμž„ with Python

ν˜•μ€€_It's 2023. 4. 11. 15:20
728x90
λ°˜μ‘ν˜•

πŸ“Œ BOJ 1124 μ–Έλ”ν”„λΌμž„

πŸ’‘ 쑰건

  1. μžμ—°μˆ˜ Xλ₯Ό μ†ŒμΈμˆ˜λΆ„ν•΄ν•˜λ©΄, κ³±ν•΄μ„œ Xκ°€ λ˜λŠ” μ†Œμˆ˜μ˜ λͺ©λ‘μ„ 얻을 수 μžˆλ‹€.
    예λ₯Ό λ“€μ–΄, 12 = 2 Γ— 2 Γ— 3이닀. 1은 μ†Œμˆ˜κ°€ μ•„λ‹ˆλ‹€.

  2. μ–΄λ–€ 수 Xλ₯Ό μ†ŒμΈμˆ˜λΆ„ν•΄ ν•΄μ„œ κ΅¬ν•œ μ†Œμˆ˜μ˜ λͺ©λ‘μ˜ 길이가 μ†Œμˆ˜μ΄λ©΄, κ·Έ 수λ₯Ό μ–Έλ”ν”„λΌμž„ 이라고 ν•œλ‹€.

  3. 12λŠ” λͺ©λ‘μ— ν¬ν•¨λœ μ†Œμˆ˜μ˜ κ°œμˆ˜κ°€ 3개이고, 3은 μ†Œμˆ˜μ΄λ‹ˆ 12λŠ” μ–Έλ”ν”„λΌμž„μ΄λ‹€.

  4. 두 μ •μˆ˜ A와 Bκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, A보닀 ν¬κ±°λ‚˜ κ°™κ³ , B보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜ μ€‘μ—μ„œ μ–Έλ”ν”„λΌμž„μΈ κ²ƒμ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” 문제

  5. 2 ≀ A ≀ B ≀ 100,000

  6. μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체, μˆ˜ν•™, μ†Œμˆ˜νŒμ • μœ ν˜•μ˜ 문제

πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

예제 1

2 10

μ‹€ν–‰κ²°κ³Ό 1

5

예제 2

100 105

μ‹€ν–‰κ²°κ³Ό 2

2

예제 3

17 17

μ‹€ν–‰κ²°κ³Ό 3

0

예제 4

123 456

μ‹€ν–‰κ²°κ³Ό 4

217

⌨️ 문제 풀이

  1. μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•΄ μ†Œμˆ˜λ₯Ό νŒλ‹¨ν•  수 μžˆλŠ” is_prime λ¦¬μŠ€νŠΈμ™€ νŒμ •λœ μ†Œμˆ˜λ₯Ό 담을 primes 리슀트λ₯Ό λ§Œλ“ λ‹€.

  2. 0κ³Ό 1은 μ†Œμˆ˜κ°€ μ•„λ‹ˆκΈ°μ—, is_prime λ¦¬μŠ€νŠΈμ—μ„œ λ°˜λ“œμ‹œ 0 값을 λ„£μ–΄μ€˜μ•Ό ν•œλ‹€.

  3. A λΆ€ν„° B κΉŒμ§€μ˜ λ²”μœ„λ₯Ό μˆœνšŒν•˜λ©΄μ„œ, λ§Œλ“€μ–΄ 놓은 primes 배열도 μˆœνšŒν•œλ‹€.
    A λΆ€ν„° B κΉŒμ§€μ˜ λ²”μœ„μ˜ 숫자λ₯Ό primes λ°°μ—΄μ˜ 숫자둜 λ‚˜λˆ„λ©΄μ„œ 1을 μ œμ™Έν•œ μ†Œμˆ˜μ˜ 개수λ₯Ό μ„Όλ‹€.

  4. (3)μ—μ„œ λ‚˜μ˜¨ μˆ«μžκ°€ is_primeμ—μ„œ μ†Œμˆ˜λ‘œ νŒλ³„μ΄ λœλ‹€λ©΄ res += 1

  5. A λΆ€ν„° B κΉŒμ§€ μˆœνšŒκ°€ 끝났닀면, res λ₯Ό λ°˜ν™˜ν•œ ν›„ 좜λ ₯ν•œλ‹€.

πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

from sys import stdin

a, b = map(int, stdin.readline().split())
is_prime = [1 for i in range(100001)]
primes = []
is_prime[0:1] = 0, 0


def prime_checker():
    for i in range(2, 100000):
        if is_prime[i] == 1:
            primes.append(i)
            temp, length = i + i, len(is_prime)
            while length > temp:
                is_prime[temp] = 0
                temp += i


def check_under_prime(a, b):
    prime_checker()

    res = 0
    for i in range(a, b + 1):
        cnt, idx = 0, 0
        while 1:
            if i % primes[idx] == 0:
                cnt += 1
                i //= primes[idx]

                if i == 1:
                    break
            else:
                idx += 1
        if is_prime[cnt] == 1:
            res += 1

    return res


print(check_under_prime(a, b))
λ°˜μ‘ν˜•