λ°±μ€ (BOJ) 6588λ²
https://www.acmicpc.net/problem/6588
μ¬μ©μΈμ΄ : PYTHON
1.λ¬Έμ
λ¬Έμ
1742λ , λ μΌμ μλ§μΆμ΄ μνκ° ν¬λ¦¬μ€ν°μ 골λλ°νλ λ μ¨νλ₯΄νΈ μ€μΌλ¬μκ² λ€μκ³Ό κ°μ μΆμΈ‘μ μ μνλ νΈμ§λ₯Ό 보λλ€.
4λ³΄λ€ ν° λͺ¨λ μ§μλ λ νμ μμμ ν©μΌλ‘ λνλΌ μ μλ€.
μλ₯Ό λ€μ΄ 8μ 3 + 5λ‘ λνλΌ μ μκ³ , 3κ³Ό 5λ λͺ¨λ νμμΈ μμμ΄λ€. λ, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 μ΄λ€.
μ΄ μΆμΈ‘μ μμ§λ ν΄κ²°λμ§ μμ λ¬Έμ μ΄λ€.
λ°±λ§ μ΄νμ λͺ¨λ μ§μμ λν΄μ, μ΄ μΆμΈ‘μ κ²μ¦νλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
μ λ ₯μ νλ λλ κ·Έ μ΄μμ ν μ€νΈ μΌμ΄μ€λ‘ μ΄λ£¨μ΄μ Έ μλ€. ν μ€νΈ μΌμ΄μ€μ κ°μλ 100,000κ°λ₯Ό λμ§ μλλ€.
κ° ν μ€νΈ μΌμ΄μ€λ μ§μ μ μ n νλλ‘ μ΄λ£¨μ΄μ Έ μλ€. (6 β€ n β€ 1000000)
μ λ ₯μ λ§μ§λ§ μ€μλ 0μ΄ νλ μ£Όμ΄μ§λ€.
μΆλ ₯
κ° ν μ€νΈ μΌμ΄μ€μ λν΄μ, n = a + b ννλ‘ μΆλ ₯νλ€. μ΄λ, aμ bλ νμ μμμ΄λ€. μ«μμ μ°μ°μλ 곡백 νλλ‘ κ΅¬λΆλμ΄μ Έ μλ€. λ§μ½, nμ λ§λ€ μ μλ λ°©λ²μ΄ μ¬λ¬ κ°μ§λΌλ©΄, b-aκ° κ°μ₯ ν° κ²μ μΆλ ₯νλ€. λ, λ νμ μμμ ν©μΌλ‘ nμ λνλΌ μ μλ κ²½μ°μλ "Goldbach's conjecture is wrong."μ μΆλ ₯νλ€.
μμ μ λ ₯
8
20
42
0
μμ μΆλ ₯
8 = 3 + 5
20 = 3 + 17
42 = 5 + 37
2.νμ΄
μ μ nμ λ§λ€μ μλ aμ bμ μ‘°ν©μ λμκ°λ©° νμμΈ μμμΈμ§ νλ³νλ €κ³ νλ€.
12λ₯Ό μλ‘λ€μ΄ μκ°ν΄λ³΄μλ€.
12λ 1+11, 2+10, 3+9, ... 6+6 μ μ‘°ν©μΌλ‘ ꡬν μ μλ€.
μ΄λ 1κ³Ό 2λ νμμΈ μμκ° μλλ―λ‘ μ μΈν μ μλ€.
μ΄μ 3λΆν° 9κΉμ§μ μ«μ μ‘°ν© μ€ aμ bλͺ¨λ μμμΈ μ‘°ν©μ μ°ΎμΌλ©΄ λλ€.
μ΄λ aμ bλ μ κ·Έλ¦Όμ²λΌ λμΉμ μΌλ‘ λνλ―λ‘ 3λΆν° n//2κΉμ§λ§ κ²μ¬νλ©΄ λλ€.
μ΄λ μμ μ λΆν° μ°¨λ‘λλ‘ κ²μ¬νλ―λ‘ μ μΌ μ²μ λ°κ²¬λ aμbμ μ‘°ν©μ΄ b-aκ° κ°μ₯ ν¬κ²λκ³ κ³¨λλ°νμ μΆμΈ‘μ λ§μ‘±νλ€.
for i in range(3,n//2+1):
if iμ n-i λͺ¨λ μμμΈμ§ κ²μ¬!
μ΄μ μ μκ° μμμΈμ§ μλμ§ νλ¨νκΈ°λ§ νλ©΄ λλλ°, μ²μμλ μ μμ μΈ λ°©λ²μΌλ‘ isPrime ν¨μλ₯Ό ꡬννμλ€. μ΄λ κ² νλ©΄μλ μκ°μ νμ΄ 1μ΄μΈλ° λλ €λ..? νμ§λ§ μ±κ³΅μ μΌλ‘ μ μΆμ΄ λμλ€.
νμ§λ§ μλΌν μ€ν
λ€μ€μ 체λ₯Ό μ¬μ©νλ©΄ λ λΉ λ₯Έ μκ°μμ μ±κ³΅ν μ μμλ€.
μ°μ μ μ nμ λ²μκ° (6 β€ n β€ 1000000) μ΄λ―λ‘ 1~1000000 κΉμ§ 리μ€νΈλ₯Ό λ§λ€μλ€. (μΈλ±μ€λ 0λΆν° μμνλ―λ‘ 1000001κ°λ₯Ό λ§λ¬)
리μ€νΈμ μ΄κΈ°κ°μ λͺ¨λ Trueμ΄λ€.
arr=[True]*1000001
κ·Έλ¦¬κ³ 2λΆν° μμνμ¬ μμ μ΄ True
μ΄λ©΄ μμ μ μ μΈν λ°°μλ€μ λͺ¨λ μμκ° μλλ―λ‘ False
λ‘ λ°κΎΌλ€.
μ΄λ 2λΆν° μμν΄μ 1000001μ μ κ³±κ·Ό κΉμ§λ§ λ°λ³΅νλ©΄ λλλ° κ·Έ μ΄μ λ 1000001μ μ κ³±κ·Ό λ³΄λ€ μ»€μ§λ©΄ μ΄λ―Έ μμμ νλ λμμ λ°λ³΅νλ μλ―Έμλ λμμ΄ λκΈ° λλ¬Έμ΄λ€. μμΈν λ΄μ©μ μ¬κΈ°.
for i in range(2,int(math.sqrt(1000001))+1):
if arr[i]:
for j in range(i+i,1000001,i):
arr[j]=False
i+i λΆν° iμ© λνλ κ²μΌλ‘ rangeλ₯Ό ꡬμ±νμ¬ κ°λ¨νκ² μμ μ λ°°μλ€μ Falseλ‘ λ³κ²½νμλ€.
3.μ½λ
3-1. μ²μ μ μΆν μ½λ
import sys
input = sys.stdin.readline
def isPrime(n):
for i in range(2,int(n**(1/2))+1):
if n%i==0:
return False
return True
while True:
n=int(input())
if n==0:
break
for i in range(3,n//2+1):
if i%2==0 or (n-i)%2==0:
if i==(n//2):
print("Goldbach's conjecture is wrong.")
break
continue
if isPrime(i) and isPrime(n-i):
print('%d = %d + %d'%(n,i,n-i))
break
3-2. μλΌν μ€ν λ€μ€μ 체λ₯Ό μ¬μ©ν μ½λ
import sys
import math
input = sys.stdin.readline
arr=[True]*1000001
for i in range(2,int(math.sqrt(1000001))+1):
if arr[i]:
for j in range(i+i,1000001,i):
arr[j]=False
while True:
n=int(input())
flag=0
if n==0:
break
for i in range(3,n//2+1):
if arr[i]==True and arr[n-i]==True:
print('%d = %d + %d'%(n,i,n-i))
flag=1
break
if flag==0:
print("Goldbach's conjecture is wrong.")
'πμ½λ©ν μ€νΈ:CodingTest' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€ 11052λ²-νμ΄μ¬]μΉ΄λ ꡬ맀νκΈ° (0) | 2023.06.20 |
---|---|
[λ°±μ€ 1463λ²-νμ΄μ¬]1λ‘ λ§λ€κΈ° (0) | 2023.06.20 |
[λ°±μ€ 17298λ²-νμ΄μ¬]μ€ν°μ (0) | 2023.06.20 |
[λ°±μ€ 1406λ²-νμ΄μ¬]μλν° (0) | 2023.06.20 |
[λ°±μ€ 18870λ²-νμ΄μ¬]μ’νμμΆ (0) | 2023.06.20 |