ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

17103번: κ³¨λ“œλ°”ν νŒŒν‹°μ…˜

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 T (1 ≤ T ≤ 100)κ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ μ€„λ‘œ 이루어져 있고, μ •μˆ˜ N은 짝수이고, 2 < N ≤ 1,000,000을 λ§Œμ‘±ν•œλ‹€.

www.acmicpc.net

 

문제 풀이

 κ³¨λ“œλ°”νμ˜ 좔츑은 두 μ†Œμˆ˜μ˜ μ°¨κ°€ κ°€μž₯ 큰 것을 λ°˜ν™˜ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ μ΅œμ΄ˆμ— λ§Œμ‘±ν•˜λŠ” μ†Œμˆ˜λ₯Ό 찾은 경우 더 이상 μ§„ν–‰ν•˜μ§€ μ•Šκ³  μ€‘μ§€ν•˜λ©΄ λœλ‹€. 이와 달리 κ³¨λ“œ 바흐 νŒŒν‹°μ…˜μ€ μˆœμ„œκ°€ λ‹€λ₯Έ μ†Œμˆ˜ 예λ₯Ό λ“€μ–΄ 6인 경우 (1, 5) (5, 1)은 λ™μΌν•˜κ²Œ μ·¨κΈ‰ν•˜κ³  μ§μˆ˜κ°€ μ£Όμ–΄ 질 λ•Œ λ§Œμ‘±ν•˜λŠ” 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

 

from sys import stdin


def is_prime(n):
    nums = [True] * n
    for i in range(2, int(n ** 0.5) + 1):
        if nums[i]:
            for j in range(i + i, n, i):
                nums[j] = False
    return nums


if __name__ == "__main__":
    T = int(stdin.readline())
    nums = is_prime(1000000)
    for _ in range(T):
        n = int(stdin.readline())
        cnt = 0
        for i in range(3, n // 2 + 1, 2):
            if nums[i] and nums[n - i]:
                cnt += 1
        print(cnt)

 κ³¨λ“œλ°”흐 μΆ”μΈ‘κ³Ό μœ μ‚¬ν•œ μ½”λ“œλ‘œ 카운트만 ν•˜λ„λ‘ μΆ”κ°€ν•˜μ˜€λŠ”λ° 아무리 μˆ˜μ •ν•˜κ³  잘λͺ»λœ 뢀뢄을 찾아도 μ±„μ ν•˜λ‹€κ°€ κ²°κ΅­μ—” ν‹€λ Έλ‹€κ³  ν•œλ‹€. μ–΄λ””κ°€ λ¬Έμ œμΈμ§€ 계속 κ³ λ―Όν•΄ 보아도 잘 λͺ¨λ₯΄κ² λ‹€.πŸ˜₯

 

 κ·Έλž˜λ„ μ‚½μ§ˆν•˜κ³  방법을 계속 κ³ λ―Όν•˜λ©΄μ„œ μ—μŠ€ν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό 쑰금 더 λͺ…ν™•νžˆ 이해할 수 μžˆλŠ” κΈ°νšŒκ°€ 된 것 κ°™λ‹€.

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€