PS/BaekJoon

6588 Python κ³¨λ“œλ°”νμ˜ μΆ”μΈ‘ λͺ¨λ“  μˆœμ—΄

chaerlo127 2023. 7. 31. 00:08
728x90

문제 

 

6588번: κ³¨λ“œλ°”νμ˜ μΆ”μΈ‘

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, n = a + b ν˜•νƒœλ‘œ 좜λ ₯ν•œλ‹€. μ΄λ•Œ, a와 bλŠ” ν™€μˆ˜ μ†Œμˆ˜μ΄λ‹€. μˆ«μžμ™€ μ—°μ‚°μžλŠ” 곡백 ν•˜λ‚˜λ‘œ κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. λ§Œμ•½, n을 λ§Œλ“€ 수 μžˆλŠ” 방법이 μ—¬λŸ¬ 가지라면, b-aκ°€ κ°€μž₯ 큰

www.acmicpc.net

 

import math
import sys

# ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 갯수
maxValue = 1000000
lists = [True] * (maxValue + 1)
lists[0] = lists[1] = False

# μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체
for i in range(2, int(math.sqrt(maxValue) + 1)):
    if lists[i]:
        # 1. μ‹œκ°„ 초과 λ‚˜μ„œ μΆ”κ°€ν•œ λ‚΄μš© => ν•œ 번 ν™•μΈν•œ λ‚΄μš©μ€ λ‹€μ‹œ ν™•μΈν•˜μ§€ μ•Šμ•„λ„λ¨ μ•„λ‹ˆλ©΄ 같은 일을 λ°˜λ³΅ν•˜λŠ” 것이기 λ•Œλ¬Έ
        # 2. λ‹€μŒκ³Ό 같은 경우둜 μ‚¬μš©μ„ ν•˜λ©΄ μ•„λž˜ μ½”λ“œλ³΄λ‹€ μ‹œκ°„μ΄ 였래걸림
        # while i * j <= maxValue:
        #     lists[i * j] = False
        #     # 짝수 및 μ†Œμˆ˜κ°€ μ•„λ‹ˆλ©΄ λ‹€ False
        #     j += 1
        for j in range(i * i, maxValue + 1, i):
            lists[j] = False  # 3. 배수의 λͺ¨λ“  값듀을 False 둜 λ³€κ²½ i*(i+i)

while True:
    n = int(sys.stdin.readline())

    # 0 이면 break
    if n == 0:
        break
    check = False

    # 계산 둜직
    for i in range(3, n, 2): 
        # 문제 ν•΄κ²° => 3~nκΉŒμ§€ +1μ”© ν™•μΈν•˜μ§€ μ•Šκ³  +2μ”© 확인함. 
        if lists[i] and lists[n - i]:
            print(str(n) + " = " + str(i) + " + " + str(n - i))
            check = True
            break

    # 두 ν™€μˆ˜ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μ—†λŠ” 경우
    if not check:
        print("Goldbach's conjecture is wrong.")

 

ν•΄κ²° κ³Όμ •

1. if μ½”λ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ ν•œ 번 ν™•μΈν•œ 값은 λ‹€μ‹œ ν™•μΈν•˜μ§€ μ•Šλ„λ‘ => λͺ…ν™•ν•œ 문제 해결은 μ•„λ‹ˆμ—ˆμ§€λ§Œ, ν•„μš”ν•œ λΆ€λΆ„μ΄μ—ˆμŒ.

2.  while문을 톡해 μ—λΌν† μŠ€ν…Œλ„€μŠ€ 체둜 μ†Œμˆ˜λ₯Ό κ΅¬ν•˜λ©΄ for 문을 μ‚¬μš©ν•˜λŠ” 것보닀 μ‹œκ°„μ΄ μ˜€λž˜κ±Έλ¦°λ‹€λŠ” λΈ”λ‘œκ·Έλ₯Ό μ°Έμ‘° ! => λ˜‘κ°™μ€ μ‹œκ°„ 초과 μ—λŸ¬ !

3. λ§ˆμ§€λ§‰μœΌλ‘œ κ³„μ‚°λ‘œμ§μ—μ„œ n을 1을 λ”ν•˜μ—¬ ν•˜λ‚˜ν•˜λ‚˜ ν™•μΈν•˜λŠ” κ²ƒμ—μ„œ μ§μˆ˜λŠ” ν™•μΈν•˜μ§€ μ•Šκ³  ν™€μˆ˜λ§Œ ν™•μΈν•˜κΈ° μœ„ν•΄ 2을 λ”ν•˜μ—¬ 절반으둜 값을 쀄여 μ§„ν–‰ν•˜λ‹ˆ μ‹œκ°„ 초과 μ—λŸ¬ ν•΄κ²° 성곡 !

 

문제 풀이

λ§Žμ€ μ‹œν–‰μ°©μ˜€κ°€ μžˆμ—ˆμ§€λ§Œ, μž‘μ€ μ½”λ“œ ν•˜λ‚˜κ°€ μ‹œκ°„μ΄ˆκ³Ό λ¬Έμ œκ°€ 될 수 μžˆμ–΄ μ„¬μ„Έν•˜κ²Œ μ ‘κ·Όν•΄μ•Όν•œλ‹€λŠ” 것을 λ˜μƒˆκΈ°κ²Œ λ˜μ—ˆλ‹€.

728x90